#1 Wed 30 May 2001 22:22
- Laliberte, Alain
- Invité
Intersection
Bonjour a tous,
Est-ce quelqu'un connait un outil pour faire un intersection sur deux tables
de polygones et conserver le resultat dans une nouvelle table.
Merci
bien cordialement,
Alain Laliberte
Resp. SIG
Falconbridge Ltd
#2 Wed 30 May 2001 22:26
- Jacques Paris
- Invité
Re: Intersection
IntersectionIl y a au moins une application (INTERSCT.zip) sur DirectionsMag
tools qui fait cela. Mais il faut bien preciser que celle-ci ne conserve
que les zones decoupees qui sont communes aux deux tables.
Jacques Paris
jacques@ paris-pc-gis.com
MapInfo Support: http://www.paris-pc-gis.com
#3 Thu 31 May 2001 22:22
- Roddier Sebastien
- Invité
Re: Intersection
Bonjour
Il existe aussi overlay.mbx (code source egalement disponible)sur
directionsmag.com/tools.
Cet outil genere les objets en intersection avec les deux couches et
conserve aussi les attributs des deux couches.
Pour ceux qui travaillent egalement avec ArcInfo cet utilitaire est
l'equivalent de la commande INTERSECT.
J'ai, il y a 2 ou 3 ans, developpe un Module d'Analyse Spatiale
(MAS.mbx) qui rassemble toutes les commandes d'ArcInfo (UNION,
INTERSECT, FLIP, IDENTITY, etc...) mais pour MapInfo.
A l'epoque les limitations materielles (puissance des machines)
m'avaient empechees de pousser plus loin mon developpment (temps de
traitement). Aujourd'hui cet utilitaire me permet d'effectuer 90% de mes
traitements geographiques sous MapInfo. A titre de comparaison j'ai
tester un UNION sur deux couverture avec l'utilitaire MapInfo sur un
PIII 500 128 MoRam et l'equivalent sous ArcInfo sur une station de
travail (de puissance sensiblement equivalente au PC). Resultat : le
temps de traitement sous MapInfo est 5 fois plus rapide que sous Arc. De
plus les resultats sont identiques, quasiment a la 3eme decimale pres.
Cela ne veut pas dire que MapInfo est plus puissant mais que la somme de
fichiers annexes que doit gerer arcInfo , diminue grandement la vitesse
de traitement.
Je precise que cet outil (MAS.mbx) n'est pas en vente, la societe pour
laquelle je travaille (Geo-Hyd - www.geo-hyd.com) ne developpe que des
utilitaires pour son propre usage.
En fin pour ceux qui possedent Mapbasic, vous pouvez toujours tester la
commande nouvel_objet = OVERLAP(objet1, objet2) dans une boucle qui
parcoure les objets des deux tables l'ue apres l'autre.
A Bientot
#4 Thu 31 May 2001 22:24
- Laliberte, Alain
- Invité
Re: Intersection
Merci pour vos reponses.
En effet, overlay fonctionne tres bien.
Alain Laliberte
Resp. SIG
Falconbridge Ltd
#5 Wed 29 August 2001 21:58
- Vvestri
- Invité
Re: Intersection
Grenoble, le 29 aout 2001
Bonsoir,
En mai de cette annee une question avait ete posee sur l'intersection. Je me
permets aujourd'hui d'y revenir car j'ai un probleme semblable et malgre les
reponses de certains d'entre vous je n'arrive pas tout a fait au resultat
souhaite.
Je possede un fichier de polygones (exemple : des communes) et un
fichier-grille (ex : un maillage de 100x100 metres). Si dans une maille
trois communes se partagent la superficie je souhaiterais recuperer la
commune dont la superficie est la plus importante.
J'ai tente une combinaison de area, overlap sans succes.
Je ne souhaite pas utiliser d'outils MBX tout pret car je dois integrer
cette option dans l'un de mes modules. Dommage car Intersct fonctionne tres
bien !!
J'espere que certains d'entre vous pourront m'aider...
Bien cordialement
Veronique VESTRI
Ingenieur SIG
vvestri@ atmo-rhonealpes.org
#6 Thu 30 August 2001 21:58
- FERRATON Alain (Resp Du Groupe), CETE Ouest/DIOG/
- Invité
Re: Intersection
Exemple de code que j'utilise pour faire quelques chose qui ressemble a
votre besoin
(calcul de colonnes au prorata de la somme des surfaces intersectees)
IL suffit de modifier un peu pour recuperer le nom de la commune
(chez-moi ce sont des disques generes pas tampons autour d'un centroide qui
jouent l'equivalent des communes)
La grille est une table ici appelee ~EMPRISE. (elle est generee a partir
d'un sous-ensemble de l'utilitaire gridmaker.mb)
J'utilise une procedure pour pouvoir mettre une jauge d'avancement.
code appellant
****************************************************************************
********************
print Calcul des ratios dans la grille...
'boucle avec barre de progression
iNombreCellule = TableInfo( ~emprise , TAB_INFO_NROWS)
redim aVar(iNombreColonne) 'aVar : tableau declare
comme alias , iNombreColonne est le nombre de colonnes choisies de la table
~EMPRISE
redim fVar(iNombreColonne) 'fVar : tableau de
flottants
redim fTotaux(iNombreColonne) 'fTotaux : tableau de
flottants
for i = 1 to iNombreColonne
aVar(i) = ~disques. + sColonneALisser(i) 'initialisation des alias,
sColonneALisser est un tableau de string -> noms de certaines colones de la
table ~DISQUES
next
O_sel1 = ~emprise + .Obj 'defini comme alias
O_sel2 = ~Disques + .Obj 'defini comme alias
i = 1
Fetch First from ~emprise
i = ~emprise.rowid 'on se place sur le 1ere enregistrement 'non
deleted'
ProgressBar Calcul des ratios dans la grille.
Calling AlimentationGrille Range iNombreCellule
if Not CommandInfo(CMD_INFO_STATUS) then
print Operation interrompue par l'utilisateur
Drop Table ~emprise
Drop Table ~Disques
exit sub
end if
Sub AlimentationGRille
'***************************************************************************
********************
Dim k as integer
Select * from ~Disques where ~disques.obj intersects (select obj from
~emprise where rowid = i) into ~BufferDisques noselect
(On selectionne les disques qui intersectent l'element i de la grille
~EMPRISE, notez la requete imbriquee
ceci accelere grandement les calculs)
OnError goto ERROR3 '(il faut traiter les erreurs car la fonction Overlap
peut echouer dans Map-Info en particulier pour des pb de precision si on
travaille en Lambert)
'(il est conseille d'utiliser l'utilitaire de definition des 'Bounds' dans
la projection de la table si des pb arrivent)
'(Gestionnaire d'outils -> Defini et applique des bornes a une carte (a
partir de la V6.0))
Fetch Rec i from ~emprise 'on se positionne sur
l'enregistrement i
Obj1 = O_sel1 'Obj1, Obj2 defini comme
'object, O_sel1, O_Sel2 comme alias
'remise a 0 des totaux (pas necessaire pour vous)
'-------------------------------
for k = 1 to iNombreColonne
ftotaux(k) = 0
next
'--------------------------------
Fetch First from ~BufferDisques 'on balaye le query resultant de la
requete en debut de procedure
While not EOT( ~BufferDisques )
Obj2 = O_sel2
esurf = Area(overlap(Obj1, Obj2), sq m ) 'surface intersectee avec les
disques
''ici il faut remplacer le traitement pour memoriser la commune ayant la
plus grande surface...
-------
---------------------------------------------------------
if esurf 0 then
DisqueSurf = Area(Obj2, sq m )
for k = 1 to iNombreColonne
fVar(k) = aVar(k)
fTotaux(k) = fTotaux(k) + (esurf / DisqueSurf) * fVar(k)
next
end if
'------
------------------------------------------------------------
APRES_ERREUR: ' si la fonction overlap echoue on
continue le traitement quand meme apres message d'erreur a l'utilisateur
Fetch next From ~BufferDisques
Wend
' le traitement qui suit consiste a mettre a jour les colonnes de la table
~EMPRISE
-------
--------------------------------------------
'(l'utilisation de run command est rendu necessaire car je ne connais pas a
l'avance le nom des colonnes de la table ~EMPRISE (table de travail)
sCMD = Update ~emprise Set + sColonneALisser(1) + = + fTotaux(1)
'sCMD est une string utiliser dans run command
for k = 2 to iNombreColonne
sCMD = sCMD + , + sColonneALisser(k) + = + fTotaux(k)
next
sCMD = sCMD + where rowid = + i
run command sCMD
'------
-------------------------------------------
i = i + 1
onError goto 0
if i > iNombreCellule then
ProgressBar = -1
else
ProgressBar = i
end if
'traitement des erreurs
'------------------------------------
ERROR3:
If Err() then
print **************ERREUR************
print Error()
print ERREUR : ~EMPRISE ligne = + str(~emprise.rowid) + ~DISQUES
ligne = + str(~disques.rowid)
print Les tables ~emprise et ~disques ne seront pas fermees, ->
reperer les lignes en erreur SVP
lerreur = T
Resume APRES_ERREUR
End If
end sub
Cordialement,
FERRATON Alain
alain.ferraton@ equipement.gouv.fr