#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: 1554
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)
Hors ligne
#4 Wed 16 December 2015 10:09
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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: 1554
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: 1554
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: 1554
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: 1554
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