#1 Wed 19 March 2003 09:06
- Remyclem
- Invité
requete selection d'objets particuliers
Bonjour,
Je voudrais realiser une requete permettant de selectionner tout les polygones de ma table possedant un trou , c'est a dire une zone interne ne faisant pas partie de l'objet (et n'en contenant d'ailleurs aucun). Quelqu'un sait-il comment faire cela ?
D'avance merci.
Remy
#2 Wed 19 March 2003 12:55
- Jacques Paris
- Invité
Re: requete selection d'objets particuliers
Voici un beau petit probleme et la facon toute particuliere qu'a MapInfo de
traiter de la topologie des objets n'aide pas. Un polygone a trou
n'existe pas a proprement parler. Pour les detecter, il faudrait, d'apres
moi, decomposer toute region de plus d'un polygone dans ses polygones
constitutifs et les fusionner. Dans le cas le plus simple d'une region avec
un seul trou, le polygone du trou sera absorbe par le plus grand. Il suffit
alors de comparer la surface de la region originale avec celle du polygone
fusionne ce qui devrait rendre evident la presence d'un trou.
Est-ce la meilleure facon de proceder? Est-ce que cela vaudrait la peine
d'ecrite une fonction?
Jacques Paris
#3 Wed 19 March 2003 17:09
- Béatrice FERNANE
- Invité
Re: requete selection d'objets particuliers
Bonjour,
Une approche de la solution pourrait consister a convertir tous les polygones en polylignes, a desagreger les objets polylignes sans conserver les trous. Il resterait alors a selectionner tous les polylignes qui seraient au moins deux a posseder le meme identifiant. Une requete avec les identifiants permettait enfin de selectionner les fameux polygones dans la table d'origine.
cordialement
Beatrice FERNANE
mail : beatrice.fernane@ franche-comte.environnement.gouv.fr
#4 Wed 19 March 2003 17:09
- Eric Mauviere
- Invité
Re: requete selection d'objets particuliers
Bonjour,
voici deux fonctions qui me servent depuis quelque temps, la seconde permet de savoir si un objet est troue.
Cordialement,
Eric Mauviere
http://www.geoclip.net
function extracpoly(byval zone as object,byval numpoly as integer) as object
'extrait un polygone d'un objet a partir de son indice
dim regvide as object
if objectinfo(zone ,OBJ_INFO_NPOLYGONS)>=numpoly then
if objectinfo(zone ,OBJ_INFO_NPOLYGONS+numpoly)>2 then
extracpoly=ExtractNodes(zone,numpoly,1,objectinfo(zone ,OBJ_INFO_NPOLYGONS+numpoly),1)
else
Create Region Into Variable regvide 0
extracpoly=regvide
end if
else
Create Region Into Variable regvide 0
extracpoly=regvide
end if
end function
function est_troue(byval zone as object) as string
'renvoie une chaine d'indices identifiants les trous
dim m,n,npoly,k,l as integer
dim obj1,obj2 as object
dim str as string
str=
npoly=objectinfo(zone,OBJ_INFO_NPOLYGONS)
k=0
for m=1 to npoly-1
obj1=extracpoly(zone,m)
for n=m+1 to npoly
obj2=extracpoly(zone,n)
if obj1 intersects obj2 then
if obj1 entirely within obj2 then
k=k+1
str=str + m + ;
elseif obj2 entirely within obj1 then
str=str + n + ;
k=k+1
end if
end if
next
next
est_troue=str
end function