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

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Wed 16 December 2015 08:45

ceucile
Participant occasionnel
Date d'inscription: 5 Dec 2006
Messages: 48

[Oracle] Fusionner des polygones adjacents

Bonjour,

Je cherche la solution à ce problème qui me paraissait pourtant simple à la base...

J'ai dans une table plusieurs polygones dont certains sont adjacents. Mon objectif est de fusionner les polygones adjacents afin d'en créer de nouveaux que j'insérerai dans une nouvelle table

exemple :
Table A :10 polygones dont 3 proches + 2 proches + 4 proches + 1 tt seul
Table B : je veux donc insérer 4 polygones, résultant de la fusion des polygones proches de la table A


Toutes ces données sont stockées dans une base de données Oracle spatial 10g

J'ai commencer à réfléchir aux différents opérateurs spatiaux et fonctions d'agrégation disponibles ms je ne m'en sors pas.

Le sdo_aggr_union me fusionne tous les polygones ou permet le regroupement sur un attribut mais je n'ai pas trouvé le moyen de faire un group by sur un opérateur spatial (genre un sdo_touch?...)

Je n'arrive pas à utiliser le sdo_join... et jusque là j'ai eu beau tourner le problème ds tous les sens je ne trouve pas de solution


Merci d'avance si vous pouviez me donner qq pistes supplémentaires, voire mm la solution!

Cordialement,

Hors ligne

 

#2 Wed 16 December 2015 09:51

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1534

Re: [Oracle] Fusionner des polygones adjacents

Bonjour,

Dans votre cas, le plus simple est de faire la fusion (vous obtenez un multi G), puis "exploser" le résutalt en polygones individuels et traiter le groupe que vous voulez.

Nicolas

Hors ligne

 

#3 Wed 16 December 2015 10:04

ceucile
Participant occasionnel
Date d'inscription: 5 Dec 2006
Messages: 48

Re: [Oracle] Fusionner des polygones adjacents

Merci pour votre réponse

Je ne suis pas sure d'avoir bien compris, fusionner l'ensemble des polygones de la table A avec un sdo_aggr_union, puis les exploser? Avec quel genre d'opérateur spatial?
Je ne vois ce que je peux espérer obtenir aprés la désagrégation à part mes 10 polygones de départ à vrai dire...

Je souhaite fusionner tous les polygones qui se touchent en fait

J'ai ajouté un schéma en fichier joint

Vous remerciant par avance,

Dernière modification par ceucile (Wed 16 December 2015 10:05)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#4 Wed 16 December 2015 10:09

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1534

Re: [Oracle] Fusionner des polygones adjacents

sdo_aggr_union va faire l'union de tous les polygones: ceux qui se touchent seront donc fusionnés comme vous le voulez.
Vous aurez alors une collection de 4 polygones correspondant aux 4 "zones ou les pg se touchent".

En dumpant la collection en objets individuels, vous obtenez 4 polygones.
Vous pouvez ensuite facilement, par requete, reconnaitre parmi ces 4 celui qui représente l'union des polygones de départ.

Nicolas

Hors ligne

 

#5 Wed 16 December 2015 10:22

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1534

Re: [Oracle] Fusionner des polygones adjacents

Une très bonne source d'information pour Oracle Spatial:

http://spatialdbadvisor.com/source_code … umentation

Simon Greener connait son affaire !

Nicolas

Hors ligne

 

#6 Wed 16 December 2015 10:41

ceucile
Participant occasionnel
Date d'inscription: 5 Dec 2006
Messages: 48

Re: [Oracle] Fusionner des polygones adjacents

En effet je connais ce site, on y trouve bcp de choses ms pas tjrs facile de s'y retrouver!

Je teste votre solution en attendant!

Hors ligne

 

#7 Wed 16 December 2015 11:01

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1534

Re: [Oracle] Fusionner des polygones adjacents

Oui c'est vrai. C'est aussi un peu difficile de s'y retrouver dans Oracle Spatial, je trouve.

Hors ligne

 

#8 Wed 16 December 2015 11:19

ceucile
Participant occasionnel
Date d'inscription: 5 Dec 2006
Messages: 48

Re: [Oracle] Fusionner des polygones adjacents

En effet j'obtiens un seul enregistrement dans ma table ms je vois bien que les polygones proches ont bien été fusionnés et j'obtiens une collection de 4 polygones comme vous l'avez dit.

Par contre qu'entendez-vous par dumper la collection? Je ne vois pas comment dissocier ces 4 polygones, probablement avec l'aide de fonctions ou opérateurs spatiaux, besoin de faire une boucle type pl/sql?...


En attendant je vais continuer à fouiller dans le site que vous avez mentionné...

Dernière modification par ceucile (Wed 16 December 2015 11:20)

Hors ligne

 

#9 Wed 16 December 2015 11:48

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1534

Re: [Oracle] Fusionner des polygones adjacents

Vous avez donc une seule géométrie, de type Multipolygone: elle contient 4 éléments qui sont eux des polygones.

Il n'existe hélas pas une methode simple dans Oracle pour extraire les éléments d'une collection, comme le fait st_dump(geom) dans postgis par ex.
Sur le site que j'ai envoyé, si vous cherchez "st_dump", vous verrez une fonction Oracle qui reproduit le comportement de la fonction postgis.

Sinon, la requete est faisable dans Oracle en pur SQL, en utilisant SDO_UTIL.EXTRACT
(http://docs.oracle.com/cd/B28359_01/app … m#BABBGFIB)

Avec des sous-requetes, vous pouvez savoir combien il y a d'elements dans votre collection et appeler extract pour chaque élément.

Nicolas

Hors ligne

 

#10 Wed 16 December 2015 16:38

ceucile
Participant occasionnel
Date d'inscription: 5 Dec 2006
Messages: 48

Re: [Oracle] Fusionner des polygones adjacents

Merci pour tous ces éléments...

Je n'ai malgré tout pas encore trouvé la solution, j'ai bien trouvé la fonction Oracle st_dump conçue par Simon Greener mais elle n'est pas détaillée sur son site, je n'ai pas trouvé le corps de la fonction afin de pouvoir la créer

J'ai cependant trouvé une fonction qui potentiellement pourrait faire la mm chose je pense... et qui utilise justement la fonction sdo_extract. D'aprés vous ça pourrait être une solution?
http://spatialdbadvisor.com/oracle_spat … nd-polygon

J'essaie de l'adapter car en réalité elle ne fonctionne pas et ne retourne que l'objet multi-polygone unique

Hors ligne

 

#11 Thu 17 December 2015 11:42

ceucile
Participant occasionnel
Date d'inscription: 5 Dec 2006
Messages: 48

Re: [Oracle] Fusionner des polygones adjacents

Je m'en suis sortie en adaptant tt ça à ma problèmatique...

Le résultat est un bout de code pl/sql et non une fonction, que j'ai appliqué sur l'exemple de la table cola_markets donné ds la documentation Oracle (Oracle Spatial User's Guide and Reference)

Je me suis servie du site de Simon Greener ainsi que des pistes de fonctions à utiliser données par Nicolas


Tout d'abord j'agrège mes polygone pour obtenir un seul élément multigéométrique grâce à la fonction sdo_aggr_union
Le objets adjacents fusionnent lors de l'exécution de cette fonction


Puis je désagrège les polygones de cette couche multigéométrique pour les insérer ds une table


Voici le résultat :

Code:

declare
    v_elements        number;
    v_element         number;
    v_extract_shape   mdsys.sdo_geometry;    
    p_geometry   mdsys.sdo_geometry;
begin
      select c.shape into p_geometry from cadastre.cola_markets c ;
      v_elements := mdsys.sdo_util.GetNumElem(p_geometry);
      FOR v_element IN 1..v_elements LOOP
              v_extract_shape := mdsys.sdo_util.Extract(p_geometry,v_element,0);
              insert into cadastre.cola_markets(shape) values (v_extract_shape);
              commit;
      END LOOP;
END;

Un trés grand merci à vous Nicolas, j'ai pu trouver une solution grâce aux différentes pistes que vous m'avez données!

Dernière modification par ceucile (Thu 17 December 2015 11:43)

Hors ligne

 

#12 Thu 17 December 2015 12:19

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1534

Re: [Oracle] Fusionner des polygones adjacents

Bonjour,

Cool d'avoir trouvé la solution !

J'etais en train de faire qq tests:

Dans la premiere fonction utilisée venant de Simon Greener, vous obtenez tjs un Multipolygone (MPG) (donc le meme objet que le départ) car la fonction ajoute chaque polygone extrait au MPG résultant.

Pour extraire les éléments d'une collection avec Oracle, vous pouvez effectivement ecrire une procédure pour faire l'insertion directe dans votre table, mais vous pouvez aussi utiliser une requete SQL pour générer 4 lignes depuis le MPG résultant de l'union.

L'avantage de la requête est de pouvoir etre complétée, par ex pour ajouter un ID unique a chaque ligne, pour retraiter les geom extraites (attribuer des infos provenant de la table source par ex, etc.)

Le SQL est un peu tricky: il utilise sdo_util.GetNumElem pour avoir le nombre de PG dans le MPG issu de l'union, puis utilise Extract pour extraire la Nième géométrie du MPG.

Pour pouvoir mettre au meme niveau level, qui est le numéro de la geom, et Extract(), qui a besoin de ce numéro, la clause CONNECT BY LEVEL est utilisée et on précise jusqu'a quand on veut un numéro: <= au nombre de PG:

Code:

SELECT
  level                                         AS enum,
  mdsys.sdo_util.Extract(i.geomunion, level, 0) AS GEOMETRY
FROM (
   SELECT SDO_AGGR_UNION(SDOAGGRTYPE(c.geom, 0.005)) AS geomunion
   FROM TABLEA c) i
CONNECT BY LEVEL <= mdsys.sdo_util.GetNumElem(i.geomunion);

Dans Postgresql, depuis la version 9.4, on peut faire ce genre de choses avec la clause LATERAL (mais pas besoin de ça pour extraire des pg: il existe la fonction st_dump(geom)

Nicolas

SQL from: http://spatialdbadvisor.com/oracle_spat … o-polygons

Hors ligne

 

#13 Thu 17 December 2015 16:07

ceucile
Participant occasionnel
Date d'inscription: 5 Dec 2006
Messages: 48

Re: [Oracle] Fusionner des polygones adjacents

Je vais regarder tout ça par curiosité, et essayer de comprendre! Merci!

Hors ligne

 

Pied de page des forums

Powered by FluxBB