#1 Mon 17 December 2001 20:57
- DORNE Remi
- Invité
détecter les polygones troues
bonjour a tous
je cherche a identifier les polygones troues (donc composes de 2
polygones) au milieu d'objets composes de plusieurs polygones (eux conitigus
ou independants)
merci
remi dorne
Service Analyse Spatiale
Region PACA
#2 Mon 17 December 2001 21:00
- Christophe Barbier
- Invité
Re: détecter les polygones troues
Pour trouver uniquement les objets troues, je crains qu'il n'y ait plus que
le MapBasic pour vous tirer d'affaire.
Par exemple, en recherchant les objets dont leur aire globale est inferieure
a la somme des aires des polygones qui les compose...
Christophe Barbier, I²G
christophe.barbier@ i2g.fr
#3 Mon 17 December 2001 21:00
- Christophe Barbier
- Invité
Re: détecter les polygones troues
Bonjour,
Voici une methode qui devrait fonctionner:
1- Faites une selection sur votre table en creant une nouvelle colonne qui contiendra le nombre de polygone de chaque objet.
(grace a la fonction ObjectInfo et l'argument 21 qui renseigne le nombre de polygones)
syntaxe SQL : Select Str(Objectinfo (batis.obj, 21 ) ) nbregion from batis into sel_batis
Remarque: J'utilise la fonction Str pour forcer le type de la nouvelle colonne en Caractere , sinon ca marche pas (???)
2- Ensuite, il suffit de faire une seconde selection sur cette colonne pour connaitre les objets qui ont plus d'un polygone
syntaxe SQL : Select * from sel_batis where Val(nbregion) > 1 into batis_complexes
Une autre methode tres similaire consisterait a creer une nouvelle colonne de type Entier court dans votre table et d'utiliser ensuite la fonction Table --> Mettre a jour colonne pour mettre a jour la nouvelle colonne avec l'expression ObjectInfo(Obj, 21)
L'avantage de cette 2ieme methode est que votre nouveau champ est directement de l'Entier.
Christophe Barbier, I²G
christophe.barbier@ i2g.fr
#4 Mon 17 December 2001 21:01
- Jacques Paris
- Invité
Re: détecter les polygones troues
Cette methode ne fonctonnerait que dans les cas les plus simples, et encore
seulement sur une table qui ne contiendrait que des regions simples d'un
polygone ou simples trouees (un polygone entierment a l'interieur d'un
autre). Or cette vue est tres limitative de toutes les possiblites.
La valeur fournie pas ObjectInfo(obj,21) ne fait que donner le nombre de
polygones dans la region obj. Si = 2, cela peut vouloir dire que la region
est formee de 2 elements non contigus OU d'une region unique trouee. C'est
facile d'imaginer des situations plus complexes comme une region comportant
deux lacs dont un a une ile sur laquelle il y a un lac...
MI n'a pas de fonction permettant de renseigner directement cette
caracteristique. J'ai pas mal sue il y a quelques annees en ecrivant
ExploReg qui permet pour les pre-6.5 d'extraire les polygones d'une region
complexe car l'application contient l'option de conserver les vrais beignes
(patisseries en forme de tore, a ce que l'on dit ici tres prisees des
policiers quebecois qui consomment de bons beignes et distribuent de bonnes
beignes. Non, ce n'est pas vrai, plutot derive de beignet).
Je crois qu'il faudrait passer par l'exploration sytematique de chaque
polygone constituant la region pour arriver a une bonne conclusion, soit en
comparant la superficie du plus grand a celle de la region ( mais cela peut
ne pas marcher si la region est formee de 2 sous-regions ou plus dont une
pourrait etre trouee), soit en comptant le nombre d'objets obtenus par une
selection ponctuelle au centroide de chaque polygone apres desagregation (si
>1, la region est trouee).
Quant a la question
Remarque: J'utilise la fonction Str pour forcer le type de la nouvelle
colonne en Caractere , sinon ca marche pas (???)
elle s'explique par le fait que certaines fonctions telle ObjectInfo peuvent
retourner des valeurs de types tres differents dont MI ne prend conscience
qu'au moment de l'execution. Avant ce moment, MI fremit quand il les
rencontre car il ne sait a quel saint se vouer et va systematiquement
rejeter le code. C'est pour cela qu'il faut forcer le type de facon a faire
une operation logique invoquant ObjectInfo. Ainsi ... where
str(objectinfo(obj,21))> 1 selectionne tous les objets de type pline ou
region contenant plus qu'un constituant (section de pline ou polygone)
Dans la premiere solution 1, MI a besoin de savoir le type a attribuer a la
colonne mais objectinfo() en tant que tel lui donne toutes les possibilites
de type ou presque; l'utilisation de STR() le renseigne alors. Dans l'autre
esquissee a la fin, le type de la colonne est defini par la structure meme;
il n'y aurait probleme au moment de l'execution que si une autre valeur que
21 etait utilisee pour l'argument (2 est le style de ligne ou de la police,
ou du symbole, 3 est le texte d'un objet-texte, ...)
Jacques Paris
#5 Mon 17 December 2001 21:04
- Carlos Montalvillo Gómez
- Invité
Re: détecter les polygones troues
Bonjour,
Quelqu'un serait interesse par un petit applicatif sous Mapinfo pour detecter
les polygones troues ? Contactez-moi, car j'en ai fait un. Par contre, rien a faire
pour detecter les beignes des policiers Quebecois...
Carlos Montalvillo Gomez
SGSmap - Ingenieros Consultores
Camino de Portuetxe, 83 - Oficinas 5, 6
20018 - San Sebastian - Espa=F1a
8 http://www.SGSmap.com/
* Carlos.Montalvillo@ SGSmap.com