Académique Documents
Professionnel Documents
Culture Documents
C O L E C e n t r e
N A T I O N A L E D E S d ' E t u d e s e t d e
S C I E N C E S R e c h e r c h e s
G O G R A P H I Q U E S e n S I G ( C E R S I G )
6 et 8 avenue Blaise Pascal - Cit Descartes - Champs-sur-Marne - 77455 MARNE LA VALLE CEDEX 2 Tlephone 01 64 15 31 83 Tlcopie 01 64 15 31 07 - maill : Nathalie.Sillard@ensg.ign.fr
Sommaire
Sommaire
1. 2. INTRODUCTION .................................................................................................................................7 PERSONNALISATION DE L'INTERFACE : INTRODUCTION ..................................................9 2.1. 2.2. 2.3. 3. LA BOITE PERSONNALISER ................................................................................................................9 SAUVEGARDE DES PERSONNALISATIONS ..........................................................................................9 EXEMPLE DE CREATION D'UNE COMMANDE ....................................................................................10
INTRODUCTION VISUAL BASIC FOR APPLICATION ........................................................13 3.1. EDITEUR VISUAL BASIC .................................................................................................................13 3.2. SYNTAXE VBA : RAPPELS .............................................................................................................14 3.2.1. Types de variables .................................................................................................................14 3.2.2. Dclaration et porte.............................................................................................................14 3.2.3. Les diffrents types de procdures.........................................................................................15 3.2.4. Instructions conditionnelles...................................................................................................16 3.2.5. Boucles ..................................................................................................................................17 3.2.6. Passage d'arguments : ByRef et ByVal..................................................................................18 3.2.7. Quelques remarques supplmentaires ...................................................................................18
4.
INTRODUCTION A ARCOBJECTS................................................................................................19 4.1. COM ET INTERFACES .....................................................................................................................19 4.1.1. Pourquoi des interfaces ? ......................................................................................................19 4.1.2. Implmentation ......................................................................................................................19 4.1.3. Query Interfaces (QI) ............................................................................................................21 4.2. OBJECT MODEL DIAGRAMS............................................................................................................21 4.2.1. Classes...................................................................................................................................22 4.2.2. Relations ................................................................................................................................24 4.2.3. Proprits ..............................................................................................................................26 4.2.4. Interfaces ...............................................................................................................................27 4.3. OU TROUVER DE L'AIDE ? ...............................................................................................................28 4.3.1. ArcObjects developer help.....................................................................................................28 4.3.2. Explorateur d'objets (Editeur VBA).......................................................................................28 4.3.3. Esri Object Browser ..............................................................................................................29 4.4. GLOBAL VARIABLES SCOPE ............................................................................................................29 4.5. EXEMPLES : MANIPULATION D'OBJETS ARCMAP ............................................................................30 4.5.1. ActiveView .............................................................................................................................30 4.5.2. Layers ....................................................................................................................................31
5.
LECTURE DE CHAMPS, REQUETE SEMANTIQUE, TRAVAIL SUR LA SELECTION......33 5.1. FEATURECLASS ET FEATURE..........................................................................................................33 5.1.1. Prsentation gnrale............................................................................................................33 5.1.2. IFeatureClass ........................................................................................................................34 5.1.3. Lecture de valeurs de champs................................................................................................35 5.2. ENUMERATION DES OBJETS SELECTIONNES SUR LA CARTE .............................................................35 5.3. CURSEUR SUR LES OBJETS SELECTIONNES (SUR UNE COUCHE) .......................................................36 5.4. REQUETES SEMANTIQUE AVEC LES QUERY FILTERS .......................................................................37 5.5. RECUPERATION D'EVENEMENT SUR LA SELECTION .........................................................................38
6.
GEOMETRIE ......................................................................................................................................39 6.1. GEOMETRIE DANS UNE GEODATABASE ...........................................................................................39 6.2. LA GEOMETRIE DANS ARCOBJECTS ................................................................................................39 6.2.1. Points et Multipoints..............................................................................................................40 6.2.2. Segments (Line, Circular Arc, BezierCurve) .........................................................................40 6.2.3. Paths et Polylines ..................................................................................................................40
3/101
Sommaire
6.2.4. Rings et Polygons ..................................................................................................................41 6.2.5. Envelopes ..............................................................................................................................42 6.3. EXEMPLE : LECTURE DE LA GEOMETRIE D'UN POLYGONE ..............................................................43 7. AFFICHAGE ET RAFRAICHISSEMENT D'ECRAN...................................................................45 7.1. 7.2. 8. UTILISATION DU SCREENDISPLAY POUR DESSINER DES ELEMENTS GRAPHIQUES ...........................45 RAFRAICHISSEMENTS D'ECRAN ......................................................................................................46
SYMBOLES.........................................................................................................................................49 8.1. 8.2. 8.3. 8.4. 8.5. COULEUR .......................................................................................................................................49 POINTS ...........................................................................................................................................50 LIGNES ...........................................................................................................................................51 SURFACE ........................................................................................................................................53 TEXTE ............................................................................................................................................53
9.
SYMBOLISATION DE COUCHES..................................................................................................57 9.1. LA CLASSE FEATURERENDERER.....................................................................................................57 9.2. EXEMPLE : REPRESENTATION EN UTILISANT UNE CLASSIFICATION PAR INTERVALLES EGAUX .......57 9.2.1. Cration de l'histogramme ....................................................................................................58 9.2.2. Cration de la classification..................................................................................................58 9.2.3. Cration d'une rampe de couleurs.........................................................................................59 9.2.4. Cration du Renderer............................................................................................................60 9.3. AFFICHAGE DE LABELS...................................................................................................................60
10.
MISE EN PAGE ..............................................................................................................................63 SCHEMA GENERAL .....................................................................................................................63 CAS PARTICULIER DES ELEMENTS LIES A LA CARTE ....................................................................65 GRAPHICS CONTAINER ...............................................................................................................66 EXEMPLE : AJOUT D'UNE IMAGE A LA MISE EN PAGE ..................................................................67 ZOOM SUR LA PAGE ....................................................................................................................68
11.1. IDISPLAYTRANSFORMATION ......................................................................................................69 11.2. CREATION D'UN OUTIL : EXEMPLE D'OUTIL "PAN".....................................................................70 11.3. REFERENCES SPATIALES ET PROJECTION ....................................................................................71 11.3.1. Rfrences spatiales ..............................................................................................................71 11.3.2. Changement de projection.....................................................................................................73 12. ANALYSE SPATIALE...................................................................................................................75
12.1. SPATIALFILTER ..........................................................................................................................75 12.2. SPATIAL OPERATOR INTERFACES................................................................................................76 12.2.1. ITopologicalOperator ...........................................................................................................76 12.2.2. IProximityOperator ...............................................................................................................77 12.2.3. IRelationalOperator ..............................................................................................................78 12.3. TRANSFORMATIONS 2D..............................................................................................................78 13. MISE A JOUR DE DONNEES ......................................................................................................79
13.1. CREATION D'ENTITES OU AJOUT D'ENREGISTREMENTS DANS UNE TABLE....................................79 13.2. UTILISATION D'UNE SESSION D'EDITION......................................................................................80 13.2.1. Introduction et rappel des fonctionnalits d'dition ..............................................................80 13.2.2. Ouverture et fermeture d'une session d'dition .....................................................................81 13.2.3. Oprations de mise jour et annulations..............................................................................82 14. AJOUT DE COUCHE A PARTIR DE DONNEES EXISTANTES ...........................................83 RAPPEL : LES DIFFERENTS MODES DE STOCKAGE DANS ARCCATALOG ......................................83 SCHEMA GENERAL .....................................................................................................................84 EXEMPLE DETAILLE D'AJOUT DE DONNEES PROVENANT D'UN SHAPEFILE ...................................84 EXEMPLE D'AJOUT DE DONNEES PROVENANT D'UNE COUVERTURE.............................................86
4/101
Sommaire
15.
15.1. CREATION D'UNE GEODATABASE ...............................................................................................87 15.1.1. Cration d'une godatabase vide...........................................................................................87 15.1.2. Rfrences spatiales et champ "Gomtrie"..........................................................................87 15.1.3. Cration de champs ...............................................................................................................89 15.1.4. CreateFeatureClass...............................................................................................................90 15.2. EXPORT ET CONVERSIONS ..........................................................................................................91 16. PROGRAMMATION DE L'INTERFACE UTILISATEUR ......................................................93
16.1. UTILISATION DES COMMANDES EXISTANTES ..............................................................................93 16.2. CREATION DE BARRES D'OUTILS, MENUS ET COMMANDES ..........................................................94 16.2.1. Cration d'une barre d'outil ..................................................................................................94 16.2.2. Cration de menus et commandes .........................................................................................94 16.2.3. Cration d'un menu contextuel ..............................................................................................95 16.3. BARRE DE PROGRESSION, BARRE D'ETAT ...................................................................................96 17. PERSONNALISATION ARCCATALOG ....................................................................................97 GXDIALOG .................................................................................................................................97 GXAPPLICATION ET GXSELECTION ............................................................................................98 GXVIEW .....................................................................................................................................99
INDEX ............................................................................................................................................100
5/101
Introduction
1. Introduction
ArcInfo fournit un kit de dveloppement "ArcObjects", plate-forme de dveloppement de la famille des applications ARCGIS tels que ArcMap, ArcCatalog... Plusieurs types de dveloppements sont possibles : Personnaliser l'environnement dans ArcMap ou ArcCatalog avec VBA (Visual Basic for Application), en dveloppant des macros associes un document ArcMap (*.mxd) ou un modle (*.mxt). Crer des applications ou des contrles, en dveloppant en VB, C++, Delphi..., des DLL, des contrles ActiveX ou des excutables. Etendre le modle ArcInfo grce Visio-UML et les outils CASE, avec les langages C++, Delphi ou tout autre langage supportant la technologie COM (Component Object Model). Ce manuel dcrit plus spcifiquement l'utilisation d'ArcObjetcs avec VBA pour la personnalisation d'ArcGIS. Visual Basic for Application est la fois un langage et un environnement de dveloppement. C'est un langage interprt dont l'intrt est d'tre partag galement par d'autres applications (notamment bureautiques : Word, Access, Excel ...). Ce cours s'adresse aux dbutants en programmation sur ArcGIS ayant un pr-requis en programmation (VBA ou autre langage). Aprs un chapitre (chap. 2) consacr la personnalisation de l'interface ArcMap sans programmation, le chapitre 3 propose un bref rappel de la programmation en VBA. Le chapitre 4, essentiel pour la comprhension de ce cours, dcrit les principes de la programmation sur ArcGIS (description du vocabulaire, comment utiliser les diagrammes, qu'est-ce que la norme COM etc ...). Les 13 chapitres suivants dcrivent plus en dtail les diffrentes possibilits de dveloppement suivant les thmes souhaits (analyse, mise en page, symbolisation, gestion des donnes etc ...) et sont illustrs d'exemples de code (sur fond gris, police
courrier)
7/101
Les personnalisations sont enregistres soit dans le document courant, soit dans le modle Normal.mxt (elles seront valables dans tous les documents ArcMap). cf. ci-dessous. Par exemple, pour crer la nouvelle barre d'outil :
il suffit d'aller dans l'onglet "Barres d'outils" puis appuyer sur le bouton "Nouvelle", nommer la nouvelle barre :
puis, partir de l'onglet "Commandes", choisir la catgories de la commande ajouter et glisser/dposer la (ou les) commandes souhaites dans la bote.
9/101
MtBlanc.mxd
Paris.mxd
Niveau Document (*.mxd) Les documents ArcMap sont bass sur un modle : soit un "Project template", soit directement sur le "Normal template"
Ville.mxt
Niveau Project template (*.mxt) Les modifications apportes un Project template sont rpercutes tous les documents bass sur ce modle
Normal.mxt
Niveau Normal template (Normal.mxt) Toute modification apporte au Normal template sont rpercutes tous les modles et documents
En ce qui concerne la personnalisation d'ArcCatalog, tout est stock dans le "Normal.gxt", puisqu'il n'existe pas la notion de document avec ArcCatalog.
La premire tape consiste crer un nouveau "contrle" (c'est dire une commande) en choisissant l'item "UIControl" dans la liste des commandes (1), puis "Nouveau contrle (2). On choisit ensuite de crer un nouveau "UIButtonControl" (3 et 4). Il suffit ensuite de dplacer la commande ainsi cre dans la bote outil souhaite. Un clic-droit sur l'outil (5) permet de modifier l'image du bouton (6) et d'diter le code source (7) associ aux vnements intervenant sur le bouton :
5 3 1 4 6
10/101
Il reste implmenter la ligne de code permettant d'afficher le message lors d'un vnement clic sur le bouton (procdure "<Nom_du_bouton>_Click"), par exemple :
Private Sub UIButtonDemo_Click() MsgBox "Bonjour, Nous sommes le " & Format(Date, "dddd d mmmm yyyy") End Sub
De mme, il est possible d'implmenter le code ncessaire pour crer un "tooltip" (petit message qui apparait sur fond jaune lorsqu'on passe avec la souris sur le bouton) grce la fonction vnementielle suivante : Private Function UIButtonDemo_ToolTip() As String UIButtonDemo_ToolTip = "Date du jour" End Function
11/101
Remarque : Lorsqu'on utilise l'diteur VBA avec ArcMap, il existe un module "ThisDocument" grant les vnements lis au document (ouverture, fermeture etc ... cf exemple 5.5)
13/101
de -3,402823E38 -1,401298E-45 (valeurs ngatives) et de 1,401298E-45 3,402823E38(valeurs positives) de -1,79769313486231E308 dbl -4,94065645841247E-324 et de 4,94065645841247E-324 1,79769313486232E308
dblSurface
Variant(>16)
varLongitude
La ligne "Option Explicit" en tte de module oblige le dveloppeur dclarer toutes les variables. En son absence, c'est le type de donnes "Variant" qui est attribu toute variable non dclare.
Dim r-initialise les variables (dans l'exemple ci-dessus, i = 0 aprs la dclaration). Pour conserver la valeur de la variable entre chaque xecution de la procdure, il faut utiliser le mot-cl "Static". Dans l'exemple suivant, la variable i est incrmente chaque excution de la procdure :
Private Sub Exemple() Static i as integer i = i + 1 MsgBox i End Sub
14/101
- Niveau module : La variable est valable l'intrieur du module tout entier. Elle est dclare dans l'entte du module avec Dim ou Private puis on l'initialise dans la procdure, par exemple :
Dim strNom as string Private Sub Exemple() strNom = "Toto" ' traitements .... End Sub
- Niveau Public : La variable est valable dans tout le projet. On utilise par exemple ce type de variable lorsqu'on manipule plusieurs "forms". Elle est dclare avec le mot-cl "Public". Si la variable est dclare dans une "form", il faut faire rfrence celle-ci lorsqu'on l'utilise ailleurs, par exemple :
form2.strNom = "Toto"
Dans les gros projets, il est frquent de crer un module spcial pour la dclaration des variables "Public". Remarques : Attention la faon de dclarer les variables :
Dim count as Long Dim max as Long
est quivalent
Dim count as Long, max as long 'moins lisible
mais par contre, dans la ligne suivante, count est dfini comme "variant" :
Dim count, max as Long
Un tableau est une variable simple comportant de nombreux compartiments permettant de stocker autant de valeurs, par opposition une variable classique dote d'un compartiment destin une seule valeur. La dclaration d'un tableau se fait comme suit :
Dim curExpense(364) As Currency
Les constantes se dclarent comme suit (elles sont de type Private par dfaut) :
Const MyVar = 459
ou bien :
Public Const MyPublicVar = 5784
15/101
Private Sub CmdButton1_Click() 'Clic sur le bouton CmdButton1 ' ............ End Sub Private Sub UIToolControl1_MouseMove(ByVal button As Long, _ ByVal shift As Long, ByVal x As Long, ByVal y As Long) ' Dplacement avec la souris de l'outil UIToolControl1 '.......... End Sub
- Procdures ou "SubRoutines" : Une procdure est une srie d'instructions excutant des actions mais ne renvoyant pas de valeurs. Contrairement une procdure vnementielle, elle doit tre appele. La syntaxe est la suivante :
Porte "Private" ou "Public" Mot-cl pour une Nom de la procdure procdure Paramtres. S'il n'y pas de paramtres, on ecrit "Mymacro()" Dclaration de la procdure Instruction Instruction de fin de procdure Appel de procdure
Call MyMacro("Bonjour")
- Fonctions : Une fonction est similaire une procdure mais elle renvoie une valeur en affectant une valeur son nom dans une ou plusieurs instructions de la procdure. La syntaxe est la suivante :
Type de donnes renvoy par la fonction Private Function Divise_par_2(dblNum as Double) as Double Divise_par_2 = dblNum / 2 End Function Dim dblTest as double dblTest = Divise_par_2(9) Dclaration de la fonction La fonction renvoie cette valeur Instruction de fin de fonction Appel de fonction
Si la valeur renvoye par une fonction n'est pas utilise, on peut appeler la fonction de la mme manire qu'une procdure, sans affecter la fonction une variable et en supprimant les parenthses, par exemple :
MsgBox "Traitement termin", vbExclamation, "Calcul des intersections ..."
- Sorties de procdures : Exit Sub permet de sortir d'une procdure Exit Function permet de sortir d'une fonction
16/101
Ou bien
If condition Then [statements] [ElseIf condition-n Then [elseifstatements] ... [Else [elsestatements]] End If
Par exemple :
Sub AlertUser(value as Long) If value = 0 Then AlertLabel.ForeColor = AlertLabel.Font.Bold = AlertLabel.Font.Italic Else AlertLabel.Forecolor = AlertLabel.Font.Bold = AlertLabel.Font.Italic End If End Sub vbRed True = True vbBlack False = False
- "Select Case" : L'instruction Select Case s'utilise en en remplacement de ElseIf dans des instructions If...Then...Else lors de la comparaison d'une expression plusieurs valeurs diffrentes. La syntaxe est la suivante :
Select Case testexpression [Case expressionlist-n [statements-n]] ... [Case Else [elsestatements]] End Select
Par exemple :
Function Bonus(performance, salary) Select Case performance Case 1 Bonus = salary * 0.1 Case 2, 3 Bonus = salary * 0.09 Case 4 To 6 Bonus = salary * 0.07 Case Is > 8 Bonus = 100 Case Else Bonus = 0 End Select End Function
3.2.5. Boucles
- "For..Next" : Les instructions For...Next permettent de rpter un bloc d'instructions un certain nombre de fois. Les boucles For utilisent une variable de compteur dont la valeur est incrmente ou dcrmente chaque itration (suivant la valeur dfinie par le mot-cl step), par exemple :
Sub TwosTotal() For j = 2 To 10 Step 2 total = total + j Next j MsgBox "Le total est de " & total End Sub
17/101
- "Do..Loop" : Les instructions Do...Loop permettent d'excuter un bloc d'instructions un nombre de fois indfini, tant qu'une condition a la valeur True (avec while) ou jusqu' ce qu'elle prenne la valeur True (avec until) :
Do [{While | Until} condition] [statements] Loop
- Sorties de boucles : Exit Next permet de sortir d'une boucle For..Next Exit Do permet de sortir d'une boucle Do..Loop
est quivalent
strNameList = "La carte contient " & pMap.LayerCount & "couches :" & vbCrLf
L'instruction With permet de spcifier un objet pour une srie d'instructions. Les instructions With acclrent l'excution des procdures et permettent d'viter des saisies rptitives.
Sub FormatRange() With Worksheets("Sheet1").Range("A1:C10") .Value = 30 .Font.Bold = True .Interior.Color = RGB(255, 255, 0) End With End Sub
18/101
Introduction ArcObjects
4. Introduction ArcObjects
ArcObjects s'appuie sur la technologie COM ( Microsofts Component Object Model), il est donc possible d'tendre l'architecture d'ArcObjects en dveloppant des composants utilisant la norme COM, de la mme manire que peuvent le faire les dveloppeurs d'ESRI. Attention, COM n'est pas un langage orient objet mais une norme dfinissant des protocoles de connections entre diffrents composants logiciels, indpendament du langage de programmation. Il est ainsi possible de dvelopper des composants logiciels rutilisables et changeables. COM dfinit galement un modle de programmation dit "Interface-based programming". Les ArcObjects OMD (Object Model Diagrams) utilisent la modlisation UML avec quelques variantes afin de pouvoir reprsenter les spcificits de la norme COM (notament les interfaces). Ces modifications ajoutent des symboles pour reprsenter les diffrents types de proprits et mthodes, reprsenter les relations d'instantiation et marquer la diffrence entre abstract classes, coclasses et classes (cf. ci-dessous). Ces diagrammes aident comprendre l'architecture d'ArcObjects et compltent l'information accessibles via l'environnement de dveloppement (liste des objets, mthodes et proprits).
4.1.2. Implmentation
Prenons l'exemple suivant :
Lgende CHIEN IAnimal IChien Manger Aboyer IAnimal IOiseau OISEAU Manger Chanter Interface CLASSE Mthode
La classe "CHIEN" implmente deux interfaces "IAnimal" (comportant la mthode "Manger") et "IChien" (comportant la mthode "Aboyer"). De mme, la classe "OISEAU" implmente deux interfaces "IAnimal" et "IOiseau".
19/101
Introduction ArcObjects
Pour chaque interface un module de classe dans le projet VBA dfinit les proprits et mthodes (pas de code dans les procdures ) :
nom de l'interface
nom de la mthode
Pour chaque classe, le module de classe liste les interfaces implmentes par la classe dans la section des dclarations (Mot-cl Implements). Pour chaque interface, le code dfinit les proprits et mthodes :
nom de la classe
Interface_mthode ( )
Plusieurs modules de classe peuvent implmenter la mme interface avec un code diffrent : c'est le polymorphisme. Le module de classe se comporte comme un serveur qui attend qu'un client lui demande de retourner une proprit ou excuter une mthode. Le module client instantie la classe et appelle les mthodes et proprits :
20/101
Introduction ArcObjects
IChien
Ce mcanisme de Query Interface est trs frquent lorsqu'on dveloppe avec ArcObjects.
21/101
Introduction ArcObjects
4.2.1. Classes
On distingue 3 types de classes dans les diagrammes UML : les abstract classes, les coclasses, et les classes :
Elle dfinit des proprits gnrales communes plusieurs "sous-classes". On ne peut pas crer (instantier) d'objets avec ce type de classe. Par exemple, dans le "MapLayer OMD", on dispose de l'abstract class "Layer", correspondant une couche dans ArcMap. L'abstract class "Layer" dfinit des
22/101
Introduction ArcObjects
proprits gnrales telles que le nom ou les rfrences spatiales de la couche. Les proprits spcifiques chaque type de couche sont portes par les "sous-classes" (FeatureLayer = couches de donnes vecteur, GroupLayer = groupe de couches, TinLayer = Triangular Irregular Network)
Layer
4.2.1.2. Class
Une "class" est reprsente sur les OMD par un rectangle 3D blanc :
Une "class" est dite "instantiable" mais pas "creatable": elle ne peut pas crer directement un nouvel objet. Un objet d'une "class" peut tre cr comme proprit d'une autre classe ou grce une mthode d'une autre classe. Par exemple, dans le "GeoDatabase OMD", on dispose de la "class" "FeatureClass" correspondant une classe d'entit ArcGIS. Un objet de cette classe permet d'instancier un objet de la classe "Feature" (une entit) grce la mthode "GetFeature" par exemple.
dim pFClass as IFeatureClass set pFClass = ...'initialisation de pFClass IFeature Feature dim pFeature set pFeature 'On rcupre entit de la as IFeature = pFClass.GetFeature(i) dans pFeature un pointeur sur la ime classe d'entit pointe par pFClass
23/101
Introduction ArcObjects
4.2.1.3. CoClass
Une "class" est reprsente sur les OMD par un rectangle 3D gris :
Une "CoClass" (Component Object Class) est dite "creatable". Un objet d'une CoClass peut tre directement cr l'aide du mot-cl VBA "New". Par exemple, dans "ArcMap OMD", on dispose de la CoClass "Map", correspondant dans ArcMap un bloc de donnes.
IMap IActiveView dim pMap as IMap set pMap = New Map 'Cration d'un nouveau bloc de donnes
Map
4.2.2. Relations
Diffrents types de relations sont possibles entre ces diffrentes classes :
4.2.2.2. Instantiation
Une relation d'instanciation spcifie qu'un objet d'une classe possde une mthode pouvant crer un objet d'une autre classe, ce qui correspond l'exemple prcdent entre les classes "FeatureClass" et "Feature".
IFeature Feature
24/101
Introduction ArcObjects
4.2.2.3. Composition
Dans une relation de composition, les objets de la classe "parent" contrlent l'existence des objets de la classe "enfants". Dans l'exemple ci-dessous, si on dtruit un objet "Map" (donc un bloc de donnes ArcMap), on dtruit galement les "Layers" composant cette "Map" (donc les couches du bloc de donnes) :
MxDocument
*
Map
*
Layer
4.2.2.4. Association
Le dernier type de relation est la relation d'association, qui signifie juste que deux classes sont associes entre elles. Par exemple, dans le "geodatabase OMD", on voit qu'un objet "Field" (un attribut) peut tre associ un "GeometryDef" (objet qui dfinit des proprits gomtriques), ce qui est le cas de l'attribut "Shape" :
Field
0 .. 1 GeometryDef
25/101
Introduction ArcObjects
Un objet ne peut tre en FeatureRenderer relation qu'avec un et un seul FeatureLayer objet. C'est l'option par dfaut. Une couche vecteur est en relation avec
une "symbologie" (cf chap. 9)
0..1
Un objet peut tre en relation Field 0 .. 1 GeometryDef avec zro ou un objet Un objet "Field" peut ventuellement
tre tre associ un "GeometryDef" (si c'est un champ de type geometry)
ObjectClass 2
M..N
RelationshipClass
FeatureClass
* ou 0..*
MxDocument
Map
1..*
Un objet peut tre en relation Field 1 .. * Fields avec 1 ou plusieurs objets Un "Fields" (collection de champs
correspondant l'ensemble des champs d'une table) est associ 1 ou plusieurs champs.
4.2.3. Proprits
4.2.3.1. Proprit en lecture seule
Notation :
L'utilisation est diffrente selon qu'elle retourne une valeur ou bien une interface : - Valeur (String, Double etc ...)
Dim icount as integer icount = pMap.LayerCount
26/101
Introduction ArcObjects
En mode criture par rfrence (ie par adresse, cf. 3.2.6), il est ncessaire d'utiliser le mot-cl "Set. ". Exemple d'utilisation en criture par rfrence (set ByRef) :
Dim pFeature as IFeature Set pFeature.shape = pPoint gomtrie de l'entit pFeature 'On affecte pPoint la
4.2.4. Interfaces
Toutes les interfaces ne sont pas dcrites directement au niveau de la classe qui les implmente. Elles peuvent tre dcrites ailleurs dans le diagramme (gnralement en bas droite, indpendament d'une classe), ou bien seulement dans l'aide en ligne :
27/101
Introduction ArcObjects
Notation :
I ....
Dans certains cas, une interface hrite d'une autre interface (indiqu par la syntaxe "Iinterface1 : Iinterface2" en tte de description). Dans ce cas, toutes les mthodes et proprits de l'interface parent sont utilisables directement sans Query Interface sur l'interface hritante. C'est l'Interface Inheritance, par exemple :
Dim pTLayer as ITinLayer Set pTLayer = 'On utilise directement la 'proprit Visible de ILayer pTLayer.Visible = True MsgBox pFLayer.Name
28/101
Introduction ArcObjects
L'application "Esri Object Browser" est stocke dans le rpertoire : "< repertoire d'installation d'ArcGIS>\arcexe81\ArcObjects Developer Kit\Utilities\EOBrowser.exe"
29/101
Introduction ArcObjects
Application
IApplication
Application
ThisDocument
IDocument IMxDocument
MxDocument
Ces deux variables n'ont pas besoin d'tre dclares ni initialises, elles sont directement utilisables. Par exemple, le code suivant permet d'afficher le nom de la carte courante :
Dim pMxDoc as IMxDocument 'Query Interface pour travailler sur l'interface IMxDocument set pMxDoc = ThisDocument dim pMap as IMap 'On rcupre dans pMap un pointeur sur la carte active (focus map) set pMap = pMxDoc.FocusMap 'On affiche le nom de la carte dans un msgbox MsgBox pMap.Name Le code suivant est quivalent : Dim pMxDoc as IMxDocument set pMxDoc = ThisDocument MsgBox pMxDoc.FocusMap.Name
IDocument IMxDocument
MxDocument
FocusMap : IMap
*
IMap Map
Name : string
IDocument IMxDocument
MxDocument
ActiveView : IActiveView
*
Map IActiveView IMap IActiveView IPageLayout PageLayout
(ArcMap OMD)
30/101
Introduction ArcObjects
Comment tester le type d'ActiveView ? Le code VBA suivant teste le type de vue active, grce au mot-cl "TypeOf" :
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument 'QI entre IMxDocument et IDocument If TypeOf pMxDoc.ActiveView Is IMap Then MsgBox "La vue active est le mode donnes" ElseIf TypeOf pMxDoc.ActiveView Is IPageLayout Then MsgBox "La vue active est le mode mise en page" End If
4.5.2. Layers
Un document (MxDocument) est compos de zro plusieurs bloc de donnes (Map), eux-mmes composs de zro plusieurs couches (Layer). Pour accder une couche, on peut passer soit par le document (proprit SelectedLayer), soit par le bloc de donnes (proprits Layer et LayerCount) :
(ArcMap OMD) Comment accder une couche via le document ? Le code VBA suivant rcupre dans un pointeur la couche slectionne. Pour l'utiliser, il faut au pralable vrifier que le pointeur ne pointe pas sur rien (mot-cl "Nothing"), c'est dire qu'une couche est effectivement slectionne par l'utilisateur d'ArcMap :
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pLayer As ILayer 'On initialise pLayer avec la couche slectionne Set pLayer = pMxDoc.SelectedLayer If pLayer Is Nothing Then 'Si pLayer pointe sur rien, on affiche un message MsgBox "Vous devez slectionner une couche !" Else 'sinon on affiche le nom de la couche MsgBox pLayer.Name End If
Comment accder une couche par son nom ? On ne peut pas accder directement une couche par son nom. On doit passer par le bloc de donnes contenant la couche et parcourir l'ensemble des couches du bloc de donnes avec une boucle en testant le nom. La fonction suivante retourne la couche correspondant au bloc de donnes et au nom pass en entre de la fonction :
31/101
Introduction ArcObjects
Function FindLayerByName(pMap as IMap, sName as String) As ILayer Dim i as Integer 'Boucle sur le nombre de couche (numrotes partir de 0) For i = 0 to pMap.LayerCount 1 'Si la ime couche porte le nom recherch, la fonction ' retourne cette couche If pMap.Layer(i).Name = sName Then Set FindLayerByName = pMap.Layer(i) End If Next End Function
Utilisation d'une numration pour parcourir l'ensemble des couches : Au lieu d'utiliser une boucle "For ...Next" pour parcourir l'ensemble des couches, il est possible d'utiliser le mcanisme d'numrateur. Un numrateur est similaire un tableau une dimension avec seulement deux mthodes pour parcourir l'numrateur : Reset et Next. Il va s'utiliser gnralement avec des boucles "Do ... While" ou "Do ... Until". Par exemple :
Le code VBA suivant affiche dans un MsgBox le nombre de couches d'un bloc de donnes ainsi que leurs noms :
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pMap As IMap Set pMap = pMxDoc.FocusMap Dim strNameList As String strNameList = "La carte contient " & pMap.LayerCount _ & "couches :" & vbCrLf Dim pEnumLayer As IEnumLayer 'On rcupre un numrateur sur les couches du bloc de donnes Set pEnumLayer = pMap.Layers pEnumLayer.Reset Dim pLayer As ILayer 'On se place sur la premire couche de l'numrateur Set pLayer = pEnumLayer.Next Do While Not pLayer Is Nothing 'Tant que l'numrateur n'a pas t entirement parcouru, 'on ajoute le nom de la couche strNameList strNameList = strNameList & pLayer.Name & vbCrLf ' et on passe la couche suivante de l'numrateur Set pLayer = pEnumLayer.Next Loop 'On affiche strNameList MsgBox strNameList
(remarque : noter l'utilisation du caractre "_" pour couper une ligne de code trop longue)
32/101
Field
1..*
IRowBuffer Objet portant les renseignements sur un "Row" (champs et valeurs prises) IFields
Fields
Collection de "rows" avec des attribts stocks dans des colonnes
RowBuffer
IClass ITable
IRow IRowEvents IValidate Enregistrement dans une table. Tous les enregistrements d'une table ont les mmes champs IObject IRowSubTypes IRelatedObjectEvents Enregistrement dans une table de godatabase IFeature IFeatureBuffer IFeatureDraw IFeatureEdit IFeatureEvents Objet gographique avec une gomtrie (shape)
Row
0..*
Table
Object
ObjectClass
Feature
0..*
FeatureClass
Une "FeatureClass" (classe d'entit au sens large, pas seulement de godatabase) est une "ObjectClass" dont les objets sont des entits (Feature). Toutes les Feature d'une FeatureClass ont les mmes attributs.
33/101
5.1.2. IFeatureClass
La proprit FeatureClass sur une FeatureLayer (couche vecteur) permet d'aller lire la classe d'entit associe (ie la source de donnes de la couche)
(Map Layer OMD) Le code VBA suivant rcupre dans un pointeur la FeatureClass correspondant la premire couche de la carte active :
Dim Set Dim 'On Set Dim 'On Set pMxDoc as IMxDocument pMxDoc = ThisDocument pFLayer as IFeatureLayer rcupre la premire couche de la focus map pFLayer = pMxDoc.FocusMap.Layer(0) pFClass as IFeatureClass lit la classe d'entit associe cette couche pFClass = pFLayer.FeatureClass
34/101
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pFLayer As IFeatureLayer 'On rcupre la 3me couche de la carte Set pFLayer = pMxDoc.FocusMap.Layer(2) Dim pFClass As IFeatureClass ' .. et la classe d'entit associe Set pFClass = pFLayer.FeatureClass Dim lField As Long 'On recherche le champ "NOM_RUE_D" lField = pFClass.FindField("NOM_RUE_D") Dim pFeature As IFeature 'On recherche l'entit dont FID = 4 Set pFeature = pFClass.GetFeature(4) 'On affiche la valeur du champ pour cette entit MsgBox "NOM_RUE_D = " & pFeature.Value(lField)
NB : La proprit "SelectionCount sur l'interface IMap renseigne galement sur le nombre d'objets slectionns.
35/101
ISelectionSet
SelectionSet
IFeatureLayer IFeatureSelection
FeatureLayer
ICursor
IQueryFilter
QueryFilter
Cursor
ISpatialFilter IFeatureCursor
SpatialFilter
FeatureCursor
Le code VBA suivant affiche dans un MsgBox la valeur de l'attribut "NOM_RUE_D" pour les entits de la couche n2 slectionnes :
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pFLayer As IFeatureLayer Set pFLayer = pMxDoc.FocusMap.Layer(2) Dim pFeature As IFeature Dim pFeatureSelection As IFeatureSelection Dim pSelectionSet As ISelectionSet Dim pFeatureCursor As IFeatureCursor 'On fait une QI entre IFeatureLayer et IFeatureSelection Set pFeatureSelection = pFLayer Set pSelectionSet = pFeatureSelection.SelectionSet 'Cration du curseur avec la mthode "Search" pSelectionSet.Search Nothing, False, pFeatureCursor 'On pointe sur le premier lment du curseur avec la proprit Next Set pFeature = pFeatureCursor.NextFeature ' boucle "tant qu'on point sur quelque chose" Do While Not pFeature Is Nothing MsgBox "NOM_RUE_D = " & pFeature.Value(pFeature.Class.FindField("NOM_RUE_D")) 'On passe l'lment suivant Set pFeature = pFeatureCursor.NextFeature Loop
36/101
- Si on n'utilise pas de filtre (IQueryFilter), on passe "Nothing" - Si le paramtre "Recycling" prend la valeur True, la mme adresse mmoire est utilise pour chaque "NextFeature", d'o des performances meilleures ( utiliser en mode lecture seule). Si le paramtre prend la valeur "False", un nouvel emplacement mmoire est allou pour chaque entit du curseur. Il est ncessaire d'utiliser cette valeur (nonrecycling cursor) lorsque l'on souhaite modifier l'objet point par le curseur.
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pFLayer As IFeatureLayer Set pFLayer = pMxDoc.FocusMap.Layer(2) Dim pQueryFilter As IQueryFilter 'Cration d'un nouveau QueryFilter Set pQueryFilter = New QueryFilter 'La proprit WhereClause permet de spcifier le critre pQueryFilter.WhereClause = "SENS = 'Sens direct'_ OR SENS = 'Sens inverse'" Dim pFeatureSelection As IFeatureSelection 'QI entre IFeatureLayer et IFeatureSelection Set pFeatureSelection = pFLayer 'Execution de la requte sur la couche pFeatureSelection pFeatureSelection.SelectFeatures pQueryFilter _ , esriSelectionResultNew, False pMxDoc.ActiveView.Refresh 'Rafraichissement de la vue
Un QueryFilter peut galement tre utilis conjointement avec un FeatureCursor pour parcourir des entits extraites d'une FeatureClass suivant un critre smantique (elles ne sont alors pas "slectionnes l'cran). Le schma est le suivant :
IFeatureCursor IFeatureClass
FeatureCursor
FeatureClass
Feature
IQueryFilter
QueryFilter
ISpatialFilter
SpatialFilter
NB : Les mthodes "Add" et "Clear" sur IFeatureSelection permettent respectivement d'ajouter un lment la slection ou d'effacer la slection.
37/101
Private WithEvents m_pActiveViewEvents As Map Public Sub SetEvents() Dim pMxDoc As IMxDocument Set pMxDoc = Application.Document Set m_pActiveViewEvents = pMxDoc.FocusMap End Sub
End Sub
Extrait de la CoClass Map (ArcMap OMD)
Le mot-cl "WithEvents" indique que la variable est une variable objet utilise pour rpondre aux vnements dclenchs par un objet ActiveX. Il est valide uniquement dans les modules de classe.
38/101
Gomtrie
6. Gomtrie
6.1. GEOMETRIE DANS UNE GEODATABASE
Points Polylignes Polygones
Multipoint
polyligne multi-parties
polygone multi-parties
Point
polyligne simple
polygone simple
cheminement (path)
boucle (ring)
Segments
ligne
arc circulaire
arc elliptique
courbe de Bzier
Remarques : - pour le format shapefile, les segments sont seulement de type ligne. - Les couvertures n'acceptent pas la multi-gomtrie.
39/101
Gomtrie
Multipoint
Point
Curve
Polycurve
Segment
Path
Polyline
Line
CircularArc
BezierCurve
EllipticArc
40/101
Gomtrie
Par exemple, pour construire une polyligne compose de deux parties disjointes, on peut crire le code VBA de la manire suivante :
Dim pPoint1 As IPoint, pPoint2 As IPoint Dim pPoint3 As IPoint, pPoint4 As IPoint Set pPoint1 = New pPoint1.PutCoords Set pPoint2 = New pPoint2.PutCoords Set pPoint3 = New pPoint3.PutCoords Set pPoint4 = New pPoint4.PutCoords Point 10, 10 Point 20, 30 Point 40, 50 Point 30, 60
pPoint4
Dim pGeometryColl As IGeometryCollection Set pGeometryColl = New Polyline Dim pSegmentColl As ISegmentCollection Set pSegmentColl = New Path Dim pLine As ILine Set pLine = New Line pLine.PutCoords pPoint1, pPoint2 pSegmentColl.AddSegment pLine pGeometryColl.AddGeometry pSegmentColl Set pSegmentColl = New Path Set pLine = New Line pLine.PutCoords pPoint3, pPoint4 pSegmentColl.AddSegment pLine pGeometryColl.AddGeometry pSegmentColl pPoint2
pPoint3
pPoint1
NB : pour construire une polyline "simple", c'est dire compose d'une seule partie, il est plus simple d'utiliser la mthode "AddPoint" sur l'interface IPointCollection, implmente entre autre par la coclass "Polyline" :
pPoint4 Dim pPointColl As IPointCollection Set pPointColl = New Polyline pPointColl.AddPoint pPoint1 pPointColl.AddPoint pPoint2 pPointColl.AddPoint pPoint3 pPointColl.AddPoint pPoint4 pPoint3
pPoint2
pPoint1
Curve
Path
Polycurve
Ring
Polygon
41/101
Gomtrie
L'exemple suivant dcrit la construction d'un polygone compos de deux "rings", elles mmes construites partir de "lines" (on suppose que les points utiliss ont t construits au pralable).
Dim pSegColla As ISegmentCollection Set pSegColla = New Ring Dim pLine As ILine Set pLine = New Line pLine.PutCoords pPoint1, pPoint2 pSegColla.AddSegment pLine Set pLine = New Line pLine.PutCoords pPoint2, pPoint3 pPoint6 pSegColla.AddSegment pLine Set pLine = New Line pPoint2 pLine.PutCoords pPoint3, pPoint4 pSegColla.AddSegment pLine Dim pRinga As IRing Set pRinga = pSegColla 'QI entre ISegmentCollection et IRing pRinga.Close 'Fermeture du polygone Dim pSegCollb As ISegmentCollection Set pSegCollb = New Ring Set pLine = New Line pLine.PutCoords pPoint5, pPoint6 pSegCollb.AddSegment pLine Set pLine = New Line pLine.PutCoords pPoint6, pPoint7 pSegCollb.AddSegment pLine Set pLine = New Line pLine.PutCoords pPoint7, pPoint8 pSegCollb.AddSegment pLine Dim pRingb As IRing Set pRingb = pSegCollb 'QI pRingb.Close Dim pPolygon As IGeometryCollection Set pPolygon = New Polygon pPolygon.AddGeometry pRinga pPolygon.AddGeometry pRingb
pPoint7 pPoint3
pPoint1 pPoint5
pPoint4 pPoint8
6.2.5. Envelopes
L'enveloppe d'une gomtrie (au sens large) est le rectangle englobant minimum de cette gomtrie. Ce rectangle est dfini par ses coordonnes x, y minimum et maximum. La proprit "Envelope" (lecture) est dfinie dans l'interface IGeometry et permet de rcuprer l'enveloppe de n'importe quelle gomtrie.
Geometry
ymax
Envelope
xmin xmax
ymin
Remarque : une enveloppe tant elle-mme un type de gomtrie particulier, elle possde galement une proprit "envelope" ! Le code ci-dessous montre un exemple d'utilisation de l'enveloppe d'une entit pour zoomer sur cette entit :
'L'tendue de la carte est gale l'enveloppe de 'l'entit pFeature pMxDoc.ActiveView.Extent = pFeature.Shape.Envelope
42/101
Gomtrie
43/101
Application
IDisplay
Display
DisplayTransformation
IScreenDisplay
AppDisplay
IScreenDisplay2
ScreenDisplay
Le code VBA suivant montre comment dessiner rapidement une gomtrie donne (pPolygon qu'on suppose cr auparavant) et suivant un symbole donn (pSym qu'on suppose cr auparavant), en utilisant IScreenDisplay. Ce type d'lments graphiques n'est pas enregistr, il disparait lorsqu'on rafraichit l'cran. On utilise dans un premier temps la proprit "Display" sur IMxApplication, qui renvoie un IAppDisplay. Aprs une Query Interface, on rcupre un IScreenDisplay afin d'utiliser les mthodes de dessin :
Dim pMxApp As IMxApplication Set pMxApp = Application 'QI entre IApplication et IMxApplication Dim pAppDisplay as IAppDisplay set pAppDisplay = pMxApp.Display Dim pSDisplay As IScreenDisplay Set pSDisplay = pAppDisplay 'QI entre IAppDisplay et IScreenDisplay 'Dbut du dessin, dans le device context pSDisplay.hdc (sans cache) pSDisplay.StartDrawing pSDisplay.hDC, esriNoScreenCache pSDisplay.SetSymbol pSym pSDisplay.DrawPolygon pPolygon pSDisplay.FinishDrawing
45/101
IActiveView possde deux mthodes "PartialRefresh" et "Refresh" permettant de rafraichir l'cran. "Refresh" Invalide tous les caches, ce qui le rend peu performant, alors que "PartialRefresh" utilise au maximum les caches (il est donc utiliser de prfrence). La mthode "PartialRefresh" prend comme paramtres en entre la "phase" qui dtermine le ou les cache(s), et les donnes ou un rectangle spcifique invalider (c'est dire redessiner). Les mthodes "PartialRefresh" et "Refresh" font toutes les deux appel la mthode "Invalidate" de IScreenDisplay, dont les paramtres sont similaires (l'utilisation en est plus dlicate car il faut lui prciser quel cache mettre jour, suivant la phase choisie). Les diffrentes phases possibles sont les suivantes :
0 - esriViewNone 1 - esriViewBackground - esriAllScreenCaches 2 - esriViewGeography 4 - esriViewGeoSelection 8 - esriViewGraphics 16 - esriViewGraphicSelection 32 - esriViewForeground
Les exemples suivants montrent comment utiliser les phases de "PartialRefresh" suivant qu'on est en mode donnes ou bien en mode mise en page : Mode donnes (Map) : - Re-dessin d'une couche pLayer donne :
pActiveView.PartialRefresh esriViewGeography, pLayer, Nothing
- Re-dessin de la slection :
pActiveView.PartialRefresh esriViewGeoSelection, Nothing, Nothing
46/101
- Re-dessin de la slection :
pActiveView.PartialRefresh esriViewGraphicSelection, Nothing, Nothing
Plusieurs phases peuvent tre combines, par exemple pour invalider la fois les couches (esriViewGeography = 2) et la slection (esriViewGeoSelection = 4) :
pActiveView.PartialRefresh Nothing, Nothing esriViewGeography + esriViewGeoSelection,
ce qui quivaut :
pActiveView.PartialRefresh 6, Nothing, Nothing
47/101
Symboles
8. Symboles
8.1. COULEUR
Les classes ncessaires la manipulation de couleurs avec ArcObjects sont les suivantes :
ColorRamp Color
ColorBrowser
GrayColor
HlsColor
RandomColorRamp
HsvColor
RgbColor
A chacune des 5 sous-classes de couleur correspond une interface : ICmykColor : Cyan, magenta, yellow, black (0-255) IGrayColor : Level 0 (white) 255 (black) IHlsColor : Hue, lightness, and saturation (0-100) IHsvColor : Hue (0-360), saturation and value (0-100) IRgbColor : Red, green, and blue (0-255) Le code VBA ci-dessous montre comment crer une couleur de type RGBColor et l'affecter un symbol (pSymbol crer au pralable) :
dim pRgbColor as IRgbColor set pRgbColor as New RgbColor pRgbColor.Red = 200 pRgbColor.Green =100 pRgbColor.Blue = 57 set pSymbol.color = pRgbColor
Il existe quatre types de ColorRamp : - AlgorithmicColorRamp : dgrad de couleur entre une "from" color et une "to" color - MultiPartColorRamp : Ramp compose de plusieurs ColorRamp - PresetColorRamp : collection de 13 couleurs prdfinies - RandomColorRamp : srie de couleurs alatoires entre une "from" color et une "to" color Voir dans le 9.2.3 un exemple de cration d'une AlgorithmicColorRamp. ColorBrowser, ColorPalette et ColorSelector correspondent aux diffrentes interfaces utilisateur que l'on peut rencontrer pour choisir une couleur sous ArcMap.
49/101
Symboles
Le code VBA suivant montre l'utilisation de la classe ColorSelector pour faire apparatre l'cran le slecteur de couleurs ArcMap. La couleur slectionne par l'utilisateur (proprit color) est ensuite utilise dans cet exemple comme couleur de slection de la couche pFLayer (proprit SelectionColor de IFeatureSelection) :
Dim pColor As IColor
Set pColor = New RgbColor pColor.RGB = 255 'Rouge Dim pFSel As IFeatureSelection Set pFSel = pFLayer 'QI pFSel.SetSelectionSymbol = False Dim pselector As IColorSelector Set pselector = New ColorSelector pselector.Color = pColor Dim bColorSel As Boolean bColorSel = pselector.DoModal(0) If bColorSel Then Set pFSel.SelectionColor = pselector.Color
Remarque : noter la diffrence avec l'exemple prcdent utilisant l'interface IRgbColor o la couleur est dfinie par trois proprit Red, Green, Blue. L'interface IColor possde une proprit "RGB" qui dfinit une couleur par un entier long. On peut utiliser la fonction VB "RGB" suivante pour dfinir une couleur :
ColMyColor.RGB = RGB(intMyRedValue, intMyGreenValue, intMyBlueValue)
ou bien la fonction suivante qui permet de voir comment est faite la conversion :
Public Function RGBToLong(lngRed as Long, lngGreen as Long, lngBlue as Long) as Long RGBToLong = lngRed + (&H100 * lngGreen) + (&H10000 * lngBlue) End Function
8.2. POINTS
Les classes ArcObjects permettent de dfinir par programme l'quivalent de ce qu'on peut faire avec l'diteur de proprits des symboles d'ArcMap :
Symbol
MarkerSymbol
50/101
Symboles
Le code VBA suivant montre comment comment crer par exemple un "PictureMarkerSymbol" partir d'une image Bitmap :
Dim pPictMarker As IPictureMarkerSymbol Set pPictMarker = New PictureMarkerSymbol pPictMarker.CreateMarkerSymbolFromFile esriIPictureBitmap, _ "d:\ENSG_coul26mm-300dpi.bmp"
8.3. LIGNES
Le modle pour les symboles linaires est plus complexe et reflte le nombre important de possibilit de l'diteur de symboles linaires, notamment lorsqu'on cre un "symbole de ligne cartographique" ou un driv de type "ponctuel ligne" et "ligne barbule" :
Symbol
LineSymbol
CartographicMarkerSymbol
HashLineSymbol MarkerLineSymbol
Template
LineDecoration
*
SimpleLineDecorationElement
Un "Template" est un modle permettant de dfinir des pointills (onglet "Modle"). LineDecoration et SimpleLineDecoration permettent de dfinir des "Ligne simple de dcoration" (onglet "Proprits de la ligne") :
51/101
Symboles
Les "LineDecoration" appartiennent "CartographicLineSymbol" et ne sont pas des symboles en tant que tels. Ils sont utiliss pour placer des "dcorations" tels que des flches des emplacements particuliers le long de la ligne (par exemple au dbut ou la fin). ArcMap ne permet pas en standard de crer un seul symbole "flche" au milieu d'une ligne (et non pas au dbut et la fin). Le code VBA ci-dessous cre ce type de symbole :
On utilise pour cela l'interface "ILineProperties" implmente par la classe "CartographicLineSymbol" qui possde une proprit "LineDecoration" qui permet d'associer une "LineDecoration" au "CartographicLineSymbol" (c'est galement cette interface qu'il faut utiliser pour implmenter des symboles barbules, tirets ou ponctuels ligne). Le principe consiste crer un symbole ponctuel (de type flche), puis crer un "SimpleLineDecorationElement" partir de ce symbole, en paramtrant le positionnement de celui-ci la moiti de la ligne (grce la proprits "PositionAsRatio" et la mthode "AddPosition"). On ajoute ensuite cet lment de dcoration un nouvel objet LineDecoration, que l'on associe ensuite au symbole de ligne cartographique.
'Cration d'un nouveau symbole de ligne cartographique Dim pLineProp As ILineProperties Set pLineProp = New CartographicLineSymbol 'Cration d'une nouvelle LineDecoration Set pLineProp.LineDecoration = New LineDecoration 'Cration d'une couleur pour le symbole ponctuel Dim pColor As IColor Set pColor = New RgbColor pColor.RGB = 255 'rouge 'Cration d'un symbole ponctuel de type flche Dim pMarker As IArrowMarkerSymbol Set pMarker = New ArrowMarkerSymbol pMarker.Style = esriAMSPlain pMarker.Size = 10 pMarker.Color = pColor 'Cration d'un nouveau SimpleLineDecorationElement Dim pSLDecorElem As ISimpleLineDecorationElement Set pSLDecorElem = New SimpleLineDecorationElement 'On lui affecte le symbole flche et on fixe sa position With pSLDecorElem .MarkerSymbol = pMarker .PositionAsRatio = True .AddPosition 0.5 'un seul symbole, la moiti de la ligne End With 'On ajoute le SimpleLineDecorationElement la LineDecoration 'et on associe celle-ci au symbole de ligne cartographique pLineProp.LineDecoration.AddElement pSLDecorElem
52/101
Symboles
8.4. SURFACE
Les symboles surfaciques mettent en oeuvre les classes suivantes (plus ventuellement celles des symboles ponctuels et linaires pour les contours et les poncifs) :
Symbol
FillSymbol
Tout comme pour ls symboles ponctuels ou linaires, les symboles surfaciques possdent une proprit "Style" avec des valeurs prdfinies (numration ESRI). Pour un symbole de remplissage simple, les valeurs sont les suivantes : esriSFSSolid (c'est le style disponible dans l'diteur de symbole ArcMap), esriSFSHollow, esriSFSHorizontal, esriSFSVertical, esriSFSForwardDiagonal, esriSFSBackwardDiagonal, esriSFSCross et esriSFSDiagonalCross. L'exemple VBA suivant montre l'utilisation de ce type de symbole avec le style esriSFSDiagonalCross :
Dim pFillSymbol As ISimpleFillSymbol Set pFillSymbol = New SimpleFillSymbol pFillSymbol.Style = esriSFSDiagonalCross pFillSymbol.Color = pColor 'pColor cr avant 'Outline par dfaut (ie trait noir de 1pt)
8.5. TEXTE
Il n'existe qu'un seul type de symbole textuel, la classe "TextSymbol" n'est donc pas une Abstract Class. Elle implmente 3 interfaces, ITextSymbol, ISimpleTextSymbol et IFormattedTextSymbol qui permettent de contrler exactement la manire dont le texte doit apparatre. On retrouve dans ces trois interfaces les possibilits de l'diteur de texte ArcMap (+ l'interface IMask permettant de dfinir un masque autour du texte) :
53/101
Symboles
"TextBackGround" est la classe qui permet de dfinir des bulles de rappel et des arrire-plans de symboles, on retrouve ces paramtres dans les proprits "d'Arrire-plan du texte" de l'onglet "Proprits avances du texte". TextPath est utilise pour placer du texte le long d'une courbe :
Symbol
TextSymbol
TextBackground
TextPath
MarkerTextBackground
Callout
BallonCallout LineCallout
SimpleLineCallout
54/101
Symboles
Pour dfinir un symbole textuel, la premire chose faire est de dfinir uen police ("Font"). Il faut pour cela crer un objet COM "Font" grce l'interface "IFontDisplay" (bibliothque "stdole" : Standard OLE COM Library), par exemple un objet de la classe "StdFont" :
'Cration d'une Font "Arial Black", caractres gras, taille 40 Dim pFont As stdole.IFontDisp Set pFont = New stdole.StdFont pFont.Name = "Arial Black" pFont.Size = 40 pFont.Bold = True
Le code VBA ci-dessous montre l'utilisation de l'interface IFormattedTextSymbol pour crer un symbole texte avec un remplissage du texte par motif dgrad :
Dim pTextSymbol As IFormattedTextSymbol Set pTextSymbol = New TextSymbol pTextSymbol.Font = pFont 'Cration du symbole de remplissage"dgrad" Dim pGradFillSymb As IGradientFillSymbol Set pGradFillSymb = New GradientFillSymbol pGradFillSymb.Style = esriGFSLinear 'On affecte ce symbole au texte Set pTextSymbol.FillSymbol = pGradFillSymb
55/101
Symbolisation de couches
9. Symbolisation de couches
9.1. LA CLASSE FEATURERENDERER
La classe "FeatureRenderer" est la structure qui permet de reproduire par programme le type de symbolisation paramtrable avec l'onglet "Symbologie" sur les proprits d'une couche. Les sousclasses de FeatureRenderer correspondent aux divers modes de reprsentation :
FeatureRenderer
IIFeatureLayer IGeoFeatureLayer
FeatureLayer
SimpleRenderer
UniqueValueRenderer
ScaleDependentRenderer ClassBreaksRenderer
ProportionalSymbolRender
DotDensityRenderer
ChartRenderer
BiUniqueValueRenderer
A noter enfin la possibilit de crer son propre type de renderer, voir les exemples de l'aide en ligne (ArcObjetcs Developer Help/Samples/ArcMap/Symbology/Renderers).
57/101
Symbolisation de couches
QI
Pour crer une classification, il faut dans un premier temps rcuprer les valeurs de l'histogramme tudi (valeurs et frquences). Pour cela, on utilise un "TableHistogram", qui est la structure de donnes permettant d'accder ces informations grce la mthode "GetHistogram" :
Dim pMxDoc As IMxDocument, pFLayer As IFeatureLayer Set pMxDoc = ThisDocument Set pFLayer = pMxDoc.FocusMap.Layer(4) ' 'QI entre ITable et IFeatureLayer pour accder la table de la couche tudie Dim pTable As ITable Set pTable = pFLayer 'Cration d'un nouveau TableHistogram Dim pTH As ITableHistogram Set pTH = New TableHistogram 'On fait pointer pTH sur la table tudie et sur le champ "POP90" Set pTH.Table = pTable pTH.Field = "POP90" 'QI entre ITableHistogram et IHistogram Dim pHist As IHistogram Set pHist = pTH 'On lit les valeurs et frquences pour le champs "POP90" Dim dataValues As Variant, dataFrequency As Variant pHist.GetHistogram dataValues, dataFrequency
58/101
Symbolisation de couches
' On crit ces valeurs dans un objet Classify de type EqualInterval Dim pClassify As IClassify Set pClassify = New EqualInterval pClassify.SetHistogramData dataValues, dataFrequency 'Calcul de la classification, les bornes sont stockes dans un tableau Dim ClassCount As Long ClassCount = 4 'Nombre de classes pClassify.Classify ClassCount Dim CBArray() As Double CBArray = pClassify.ClassBreaks
Pour crer la ColorRamp, il est ncessaire de spcifier la couleur de dpart, la couleur d'arrive, l'algorithme utilis ainsi que le nombre de classes :
'On cre un dgrad de couleurs (jaune rouge) Dim pFromColor As IRgbColor 'Couleur de dpart = jaune Set pFromColor = New RgbColor pFromColor.Red = 255 pFromColor.Green = 255 pFromColor.Blue = 0 Dim pToColor As IRgbColor Set pToColor = New RgbColor 'Couleur d'arrive = rouge pToColor.Red = 255 pToColor.Green = 0 pToColor.Blue = 0 'Cration de la rampe de couleur Dim pRamp As IAlgorithmicColorRamp Dim ok As Boolean Set pRamp = New AlgorithmicColorRamp pRamp.Algorithm = esriHSVAlgorithm 'algorithme TSL pRamp.FromColor = pFromColor pRamp.ToColor = pToColor pRamp.Size = ClassCount 'ClassCount=4 couleurs pRamp.CreateRamp ok 'Cration d'une numration de couleurs Dim pEnumColors As IEnumColors Set pEnumColors = pRamp.Colors
59/101
Symbolisation de couches
NB : l'lment 0 du tableau de la classification correspond au "MinimumBreak" du Renderer ... le "Break(0) du Renderer correspond donc au deuxime lment du tableau, c'est dire CBArray(1) et aini de suite ..
'On initialise un nouveau ClassBreakRenderer Dim pCBRenderer As IClassBreaksRenderer Set pCBRenderer = New ClassBreaksRenderer 'Paramtrage du Renderer pCBRenderer.Field = "POP90" pCBRenderer.MinimumBreak = CBArray(0) pCBRenderer.BreakCount = ClassCount Dim pColor As IColor Dim pFillSymbol As ISimpleFillSymbol Dim i As Long For i = 0 To ClassCount - 1 'pour chaque classe, on affecte 'un symbole plat de couleur Set pColor = pEnumColors.Next Set pFillSymbol = New SimpleFillSymbol pFillSymbol.Color = pColor pFillSymbol.Style = esriSFSSolid pCBRenderer.Symbol(i) = pFillSymbol pCBRenderer.Break(i) = CBArray(i + 1) Next i 'on affecte le renderer la couche Dim pGeoFeatureLayer As IGeoFeatureLayer 'QI entre IFeatureLayer et IGeoFeatureLayer Set pGeoFeatureLayer = pFLayer Set pGeoFeatureLayer.Renderer = pCBRenderer 'Rafraichissement de la vue pMxDoc.ActiveView.Refresh ' ... et de la table des matires pMxDoc.UpdateContents
Enfin, on utilise la proprit "Renderer" de IGeoFeatureLayer (ncessit de faire une QueryInterface en IFeatureLayer et IGeoFeatureLayer) pour affecter le Renderer ainsi cr la couche.
60/101
Symbolisation de couches
L'exemple VBA ci-dessous affiche le contenu du champ "NOM_RUE_G" pour chaque entit (linaire)de la couche n2 du document. Pour davantage de prcisions sur les mthodes et proprits, se rfrer au diagramme "Labeling and Annotation OMD" d'ArcObjects.
IIFeatureLayer IGeoFeatureLayer
FeatureLayer
IAnnotateLayerPropertiesCollection
AnnotateLayerPropertiesCollection
'Rcupration de la couche tiqueter Dim pMxDoc As IMxDocument, pFLayer As IFeatureLayer Set pMxDoc = ThisDocument Set pFLayer = pMxDoc.FocusMap.Layer(2) Dim pGeoFLayer As IGeoFeatureLayer Set pGeoFLayer = pFLayer 'QI 'On rcupre l'ensemble des proprits d'tiquetage ' de la couche pGeoFLayer, ce qui correspond 'l'onglet tiquettes des proprits de la couche Dim pAnnoProps As IAnnotateLayerPropertiesCollection Set pAnnoProps = pGeoFLayer.AnnotationProperties
IAnnotateLayerProperties ILabelEngineLayerProperties
LabelEngineLayerProperties
'On dfinit les proprits d'tiquetage de la 'couche en crant une nouvelle "Classe" Dim pLabelEngine As ILabelEngineLayerProperties Set pLabelEngine = New LabelEngineLayerProperties pLabelEngine.Expression = "[NOM_RUE_G]"
'On dfinit un nouvel objet LineLabelPosition 'pour spcifier les options de positionnement Dim pPosition As ILineLabelPosition Set pPosition = New LineLabelPosition pPosition.ProduceCurvedLabels = True pPosition.Above = True
'On dfinit un objet BasicOverposterLayerProperties qui 'supporte les options de placement et conflits, ce qui 'correspond la fentre proprits de placement Dim pBasic As IBasicOverposterLayerProperties Set pBasic = New BasicOverposterLayerProperties pBasic.FeatureType = esriOverposterPolyline pBasic.LineLabelPosition = pPosition pBasic.NumLabelsOption = esriOneLabelPerName
IBasicOverPosterLayerProperties
BasicOverposterLayerProperties
'On affecte ces options de placement aux pLabelEngine Set pLabelEngine.BasicOverposterLayerProperties = pBasic 'QI entre IAnnotateLayerProperties et ILabelEngineLayerProperties Dim pAnnoLayerProps As IAnnotateLayerProperties Set pAnnoLayerProps = pLabelEngine pAnnoProps.Add pAnnoLayerProps 'Ajout de la classe d'tiquette 'Puis affichage des tiquettes et rafraichissement de l'cran pGeoFLayer.DisplayAnnotation = True pMxDoc.ActiveView.Refresh
Remarques : cet exemple simplifi ne fait pas intervenir de requtes SQL, ni de paramtres particulier de dtection de conflits. Il ne gre pas non plus les classes d'tiquettes existantes ... Aprs excution, il existe deux classes nommes "par dfaut" ...
61/101
Mise en page
GroupElement
DataGraphElement
FrameElement
TextElement
MapFrame MapSurroundFrame
MarkerElement PictureElement
LineElement
OleFrame
TableFrame FillShapeElement
EmfPictureElement BmpPictureElement
CircleElement
RectangleElement
EllipseElement
PolygonElement
Une mise en page ("PageLayout" cf. 4.5) est compose de cartes bases sur des entits gographiques et d'lments autres. La classe "Element" dcrit tous ces objets, entre autre tous les lments graphiques tels les textes, points, images, etc ... ainsi que les cadres entourant les cartes et objets lis aux cartes tels les lgendes, barres d'chelles etc ... Cette classe possde notament une proprit "Geometry" permettant d'accder la gomtrie de l'objet (par exemple un lment texte est positionn par un point). Les "GraphicElement" correspondent aux lments que l'on peut constuire et manipuler avec la barre d'outils "Dessin" d'ArcMap, ainsi que les images et les diagrammes insrs grce aux menus d'ArcMap :
63/101
Mise en page
Un "GroupElement" est un ensemble d'lments regroups (de la mme manire qu'avec l'item "Grouper" du menu "Dessin". Les "FrameElement" correspondent aux autres lments de la mise en page, c'est dire aux bordures et arrire-plans des lments cartographiquues. La CoClass "FrameElement" correspond l'objet "Cadre" d'ArcMap :
Un "MapFrame" est un lment de type FrameElement li un bloc de donnes (Map). Le dveloppeur peut ainsi accder l'objet Map via cet lment, ainsi qu'aux proprits bordure, arrireplan, quadrillage .... L'interface IMapFrame implmente uniquement par la CoClass MapFrame permet entre autre de grer les recatngles d'emprise ("ILocatorRectangle"), l'chelle de la carte (proprits "MapScale", "MapBounds" et "ExtentType"). On retrouve ces paramtrages dans les proprits du bloc de donnes :
Un "MapSurroundFrame" est un lment de type FrameElement li un "MapSurround", c'est dire un lments cartographique li au bloc de donne de type lgende, chelle ou flche du Nord (cf. suivant). Un MapSurroundFrame dcrit le cadre et l'arrire-plan de l'objet "MapSurround". L'interface IMapSurroundFrame fournit deux proprits MapFrame et MapSurround pour accder respectivement au MapFrame du bloc de donnes associ et au MapSurround associ.
64/101
Mise en page
NB : la mthode "CreateSurroundFrame" sur IMapFrame permet de crer des lments lis la carte tels la flche du Nord, la lgende .... Un "OleFrame" fournit les outils ncessaires pour incorporer un objet "OLE", par exemple une table Excel ou un document Word. Un "TableFrame" est une lment correspondant l'affichage d'une table dans la mise en page via le menu "Options" :
Legend
LegendFormat
LegendClassFormat
MarkerNorthArrow
Overview
Patch
ScaleText ScaleBar
LinePatch AreaPatch
ScaleLine
SingleDivisionScaleBar
DoubleFillScaleBar
SteppedScaleLine
AlternatingScaleBar
DoubleAlternatingScaleBar
HollowScaleBar
65/101
Mise en page
La CoClass "Legend" est particulirement complexe, du au grand nombre d'options offertes l'utilisateur lorsqu'il dite une lgende. Chaque couche de la carte est reprsente par un "LegendItem". Le "LegendItem" gre l'information sur la couche (Layer) associe ainsi que l'aspect de la lgende. Chaque "LegendItem" possde un "LegendClassFormat" qui contient des informations optionnelles sur l'aspect de la lgende (taille du texte, aspect du patch, ie du gabarit ...). La plupart du temps, ces prorits ne sont pas dfinies, l'objet "Legend" utilisant l'objet "LegendFormat" dfinissant des proprits par dfaut.
Le code VBA ci-dessous rcupre le graphicscontainer associ au document, parcourt l'ensemble des lments dans une boucle, et lorsque l'lment est de type "MapFrame", affiche dans un MsgBox les dimensions du bloc carte ainsi trouv (coordonnes "papier") :
Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pPageLayout As IPageLayout 'On rcupre la mise en page du document Set pPageLayout = pMxDoc.PageLayout Dim pGC As IGraphicsContainer 'QI entre IpageLayout et IGraphicsContainer Set pGC = pPageLayout pGC.Reset 'Pour tre sr d'tre au dbut Dim pElem As IElement Dim pMEnvelope As IEnvelope 'On se positionne sur le premier lment Set pElem = pGC.Next Do While (Not pElem Is Nothing) 'Si l'lment est de type FrameElement If (TypeOf pElem Is IFrameElement) Then 'Si l'lment est de sous-type MapFrame If (TypeOf pElem Is IMapFrame) Then 'On rcupre l'enveloppe de l'lment ... Set pMEnvelope = pElem.Geometry.Envelope '... et on affiche ses dimensions MsgBox pMEnvelope.Width & " sur " & pMEnvelope.Height & " cm" End If End If Set pElem = pGC.Next 'On se positionne sur l'lment suivant Loop
66/101
Mise en page
Dim pMxDoc As IMxDocument, pPageLayout As IPageLayout Set pMxDoc = ThisDocument Set pPageLayout = pMxDoc.PageLayout Dim pGC As IGraphicsContainer Dim pPic As IPictureElement, pElem As IElement Set pGC = pPageLayout 'QI entre IPageLayout et IGraphicsContainer pGC.Reset Set pPic = New BmpPictureElement 'On cre un nouvel lment image de type bmp ' Import de l'image pPic.ImportPictureFromFile "D:\ENSG_coul26mm-300dpi.bmp" pPic.MaintainAspectRatio = True 'Cration d'une envelope qui va reprsenter la gomtrie de l'lment image Dim pEnv As IEnvelope Dim dXmin As Double, dYmin As Double, dXmax As Double, dYmax As Double Set pEnv = New Envelope dXmin = 2 dYmin = 2 dXmax = 2 + (2 * pPic.PictureAspectRatio) dYmax = 2 + 2 pEnv.PutCoords dXmin, dYmin, dXmax, dYmax Set pElem = pPic 'QI entre IElement et IPictureElement pElem.Geometry = pEnv 'la gomtrie de l'lment correspond l'enveloppe pGC.AddElement pPic, 0 'Ajout de l'lment la mise en page au niveau 0 Dim pActive As IActiveView Set pActive = pPageLayout pActive.Refresh 'Rafraichissement de la mise en page
67/101
Mise en page
Le code VBA suivant montre par exemple comment zoomer sur la page entire. A noter qu'il est ncessaire de vrifier que l'application est bien en mode "mise en page" (cf. 4.5.1) :
Private Sub ZoomToWholePage() Dim pMxDoc As IMxDocument, pPageLayout As IPageLayout Set pMxDoc = ThisDocument Set pPageLayout = pMxDoc.PageLayout 'Si la vue active n'est pas le mode mise en page If Not pMxDoc.ActiveView Is pMxDoc.PageLayout Then 'Alors on bascule en mode mise en page Set pMxDoc.ActiveView = pMxDoc.PageLayout End If 'Zoom sur la page entire pPageLayout.ZoomToWhole End Sub
68/101
Display
DisplayTransformation
IAppDisplay IScreenDisplay
AppDisplay
IScreenDisplay IScreenDisplay2
ScreenDisplay
Chaque "ActiveView" possde un "ScreenDisplay", lui-mme associ un "DisplayTransformation" (cf. 7.1). Ce DisplayTransformation permet notament de passer de coordonnes carte (coordonnes terrain ou page suivant le type d'ActiveView) en coordonnes cran (pixels), ou vice-versa. Le code VBA suivant transforme un point sur la carte (coordonnes terrain) en point sur la page (coordonnes sur la mise en page) en effectuant successivement deux transformations : passage de coordonnes terrain en coordonnes cran, puis passage des coordonnes cran aux coordonnes page :
Private Sub TransformpointFromMapToPageUnits(pPoint As IPoint) Dim pMxDoc As IMxDocument Set pMxdoc = ThisDocument 'Rcupration des "ActiveView" (PageLayout et Map) Dim pLayoutV As IActiveView Dim pMapV As IActiveView Set pLayoutV = pMxDoc.PageLayout Set pMapV = pMxDoc.FocusMap 'Rcupration des DisplayTransformations associs Dim pPageTransformation As IDisplayTransformation Dim pMapTransformation As IDisplayTransformation
69/101
Set pPageTransformation = pLayoutV.ScreenDisplay.DisplayTransformation Set pMapTransformation = pMapV.ScreenDisplay.DisplayTransformation 'Passage des coordonnes terrain de pPoint en coordonnes cran Dim x As Long Dim y As Long pMapTransformation.FromMapPoint pPoint, x, y 'Passage des coordonnes cran en coordonnes page et copie dans pPoint Set pPoint = pPageTransformation.ToMapPoint(x, y) End Sub
70/101
AngularUnit PrimeMeridian
GeographicCoordinateSystem
ProjectedCoordinateSystem
UnknownCoordinateSystem
Dfini par un ellipsode et la position de cet ellipsode par rapport au cnetre de la terre
Ellipsode
Spherod
LinearUnit
(Extrait de Spatial Reference OMD) Un systme de coordonnes gographiques (systme de rfrence) est dfini par un datum, des units (longitude/latitude en degr ou grades) et un mridien d'origine. Un systme de coordonnes projetes est dfini par des units (mtres ou "feet"), une projection (ie un systme d'quations pour passer de coordonnes gographiques en coordonnes planimtriques x,y), des paramtres spcifiques de la projection et un systme de coordones gographiques. Une transformation gographique (ie un changement de systme de rfrence) est l'opration mathmatique permettant de passer d'un systme de coordonnes gographiques dans un autre. ArcObjetcs fournit un certain nombre de classes pour effectuer ces transformations, correspondant aux diffrentes mthodes de passage d'un systme dans un autre :
Transformation
GeoTransformation
GridTransformation
NADCONTransformation
HARNTransformation
PositionVectorTransformation
71/101
Enfin, la CoClasse "SpatialReferenceEnvironment" implmente l'interface "ISpatialReferenceFactory" qui fournit aux dveloppeurs des mthodes pour "crer" des objets "SpatialReference" prdfinis :
(Extrait de Spatial Reference OMD) Le code VBA ci-dessous affiche le nom du "SpatialReference" de la premire couche d'un document ArcMap. Pour obtenir cette information, il est ncessaire de faire une QI entre IFeatureLayer et IGeodataset afin de pouvoir utiliser la proprit "SpatialReference" :
Dim pMxDoc as IMxDocument Set pMxDoc = ThisDocument Dim pFLayer as IFeatureLayer Set pFLayer = pMxDoc.FocusMap.Layer(0) Dim pGeoDataset As IGeoDataset Set pGeoDataset = pFLayer 'QI Dim pSpatialRef As ISpatialReference Set pSpatialRef = pGeoDataset.SpatialReference 'On affiche le nom et le code de la ref spatiale MsgBox pSpatialRef.Name & " : " & _ pSpatialRef.FactoryCode
Pour accder aux paramtres de ce systme de projection, il suffit de faire une QI avec IProjectedCoordinateSystem (qui hrite de ISpatialReference). La mthode GetParameters permet d'aller lire ou modifier les valeurs de paramtres de la projection. On cre pour cela un tableau de 16 lments puis on va les parcourir les uns aprs les autres.
72/101
Dim pProjCoordSystem As IProjectedCoordinateSystem Set pProjCoordSystem = pSpatialRef Dim pParams(16) As IParameter pProjCoordSystem.GetParameters pParams(0) Dim pparam As IParameter Dim i As Integer Dim str As String For i = 0 To 15 Set pparam = pParams(i) If Not pparam Is Nothing Then str = str & Chr(13) & pparam.Name & _ " - " & pparam.Index & _ " - " & pparam.Value End If Next i MsgBox str
L'exemple suivant montre comment obtenir des informations sur un systme de coordonnes gographique existant ( "esriSRGeoCS_OSGB1936") en utilisant un ISpatialReferenceFactory :
Dim pSpRefFact As ISpatialReferenceFactory2 Set pSpRefFact = New SpatialReferenceEnvironment Set pGeogCoordSystem = _ pSpRefFact.CreateGeographicCoordinateSystem(esriSRGeoCS_OSGB1936) Dim pDatum As IDatum Set pDatum = pGeogCoordSystem.Datum Dim pSpheroid As ISpheroid Set pSpheroid = pDatum.Spheroid MsgBox pDatum.Name & Chr(13) & _ pSpheroid.Name & Chr(13) & _ pSpheroid.Flattening & Chr(13) & _ pSpheroid.SemiMajorAxis & Chr(13) & _ pSpheroid.SemiMinorAxis & Chr(13) & " etc ..."
De mme, on peut accder une projection o une systme de rfrence existant l'aide d'un fichier .PRJ (mthode "CreateESRISpatialReferencefromPRJFile").
11.3.2.
Changement de projection
L'interface "IGeometry" possde une mthode "Project" pour changer les "SpatialReference" d'une gomtrie donne. Pour utiliser cette mthode, il est ncessaire que les rfrences spatiales de la gomtrie d'origine soient spcifies, avant d'appliquer la mthode "Project" vers de nouvelles rfrences spatiales. Il peut galement tre ncessaire d'appliquer la mthode "Densify" la gomtrie avant de la projeter, afin de rajouter des vertex. Le code VBA ci-dessous projette un rectangle du systme de coordones gographiques "WGS84" vers le systmes de coordonnes projetes "World Equidistant Conic" :
73/101
'On suppose pGeometry cr auparavant Dim pFactory As ISpatialReferenceFactory2 Set pFactory = New SpatialReferenceEnvironment Dim pGeographic As ISpatialReference 'On affecte la SpatialReference WGS84 pGeometry Set pGeographic = pFactory.CreateGeographicCoordinateSystem(esriSRGeoCS_WGS1984) Set pGeometry.SpatialReference = pGeographic 'On cre une nouvelle SpatialRefercence "World Equidistant Conic" Dim pProjected As ISpatialReference Set pProjected = pFactory.CreateProjectedCoordinateSystem(esriSRProjCS_World_EquidistantConic) 'On projette pGeometry.Project pProjected
Si on n'utilise pas la mthode densify sur le rectangle d'origine, on obtient le rsultat suivant :
Remarque : pour visualiser la nouvelle gomtrie dans la bonne projection, il est ncessaire de modifier galement le systme de coordonnes du bloc de donnes (proprit "SpatialReference" sur IMap) :
Dim pMap As IMap Set pMap = pMxDoc.FocusMap Set pMap.SpatialReference = pProjected
74/101
Analyse spatiale
Le code suivant montre simplement la slection d'entit intersectant une gomtrie donne (pGeometry) :
Dim pSpatialFilter as IspatialFilter Set pSpatialFilter = New SpatialFilter pSpatialFilter.Geometry = pGeometry pSpatialFilter.SpatialRel = esriSpatialRelIntersects Dim pFeatureSelection as IFeatureSelection Set pFeatureSelection.SelectFeature pSpatialFilter, esriSelectionResultNew, False
Il est possible d'utiliser plusieurs SpatialFilter successivement pour excuter des requtes plus complexes. ISpatialFilter hrite des proprits et mthodes de IQueryFilter, on peut donc combiner critres gomtriques et smantiques en utilisant la proprit "WhereClause" sur un filtre spatial. Pour raliser une requte par rapport la gomtrie d'un ensemble d'objet (c'est le cas gnralement lorsqu'on fait l'quivalent d'un "Slectionner par entits" sous ArcMap), plusieurs solutions sont possibles. L'une d'entre elle consiste appliquer le filtre spatial par rapport chaque objet de rfrence successivement (dans une boucle avec un curseur par exemple). Une deuxime mthode (beaucoup plus performante) est de construire une seule "gomtrie" partir des gomtries de rfrence et d'appliquer ensuite une seule fois le filtre spatial. Le code VBA suivant utilise cette deuxime mthode pour slectionner les entits de la couche n2 intersectant les entits de la couche n4 :
75/101
Analyse spatiale
pMxDoc As IMxDocument pMxDoc = ThisDocument pFRouteLayer As IFeatureLayer pFRouteLayer = pMxDoc.FocusMap.Layer(2) pFeatureSelection As IFeatureSelection pFeatureSelection = pFRouteLayer pFBatiLayer As IFeatureLayer pFBatiLayer = pMxDoc.FocusMap.Layer(4)
Dim pEnumGeom As IEnumGeometry Set pEnumGeom = New EnumFeatureGeometry Dim pEnumGeometryBind As IEnumGeometryBind 'QI entre IEnumGeometryBind et IEnumGeometry Set pEnumGeometryBind = pEnumGeom pEnumGeometryBind.BindGeometrySource Nothing, _ pFBatiLayer.FeatureClass Dim pGeomFactory As IGeometryFactory Set pGeomFactory = New GeometryEnvironment Dim pGeom As IGeometry 'Cration d'une seule gomtrie partir de l'ensemble des entits "bati" Set pGeom = _ pGeomFactory.CreateGeometryFromEnumerator(pEnumGeom) 'Cration du filtre spatial Dim pSpatialFilter As ISpatialFilter Set pSpatialFilter = New SpatialFilter '.. sur la gomtrie pGeom ... Set pSpatialFilter.Geometry = pGeom ' ..avec la relation "intersectent" pSpatialFilter.SpatialRel = esriSpatialRelIntersects ' On slectionne les entits "troncons" pFeatureSelection.SelectFeatures pSpatialFilter, _ esriSelectionResultNew, False pMxDoc.ActiveView.Refresh
12.2.1.
ITopologicalOperator
Les oprations topologiques peuvent tre ralises sur les Polylignes, Polygones, Points et Multipoints. Elles s'appliquent une seule "gomtrie" (pas un jeu de donnes entier) et permettent par exemple de calculer des intersections, union, dcoupages, buffer ... La liste complte des oprations possibles est donne par les mthodes de l'interface ITopological :
76/101
Analyse spatiale
Le code VBA ci-dessous construit un polygone convexe le plus petit possible autour d'une entit slectionne :
Dim Dim Dim Set Set Set Dim 'On Set Dim 'On Set pEnumFeat As IEnumFeature pFeat As IFeature pMxDoc As IMxDocument pMxDoc = ThisDocument pEnumFeat = pMxDoc.FocusMap.FeatureSelection pFeat = pEnumFeat.Next pTopOp As ITopologicalOperator initalise pTopOp avec la gmtrie de l'entit pTopOp = pFeat.Shape pPolyConvex As IPolygon calcule le polygone convexe de cette gomtrie pPolyConvex = pTopOp.ConvexHull
Remarque : La gomtrie utilise pour une opration topologique doit tre "simple". Les proprits "IsKnownSimple" et "IsSimple" indique si cette gomtrie est "simple". La mthode "Simplify" transforme la gomtrie de faon ce qu'elle devienne simple.
12.2.2.
IProximityOperator
IProximityOperator permet de trouver le point le plus proche d'un point donn sur une gomtrie, ou de calculer la distance entre deux gomtries existantes. Cette interface est implmente par les CoClass "Polygon", "Polyline", "Point", "MultiPoint" ainsi que par les sous-classes de "Segment".
77/101
Analyse spatiale
Le code VBA suivant affiche dans un MsgBox les coordonnes du point pNearestPoint le plus proche sur une polyligne pPolyline du point entre pInputPoint :
Dim pNearestPoint As IPoint Dim pProxOp As IProximityOperator Set pProxOp = pPolyLine Set pNearestPoint = pProxOp.ReturnNearestPoint(pInputPoint, esriNoExtension) MsgBox "XNearestPoint = " & pNearestPoint.X & ", YNearestPoint = " & pNearestPoint.Y
12.2.3.
IRelationalOperator
ISpatialOperator fournit des mthodes retournant des boolens pour tudier les relations spatiales entre 2 gomtries. Cette interface est implmente par les CoClass "Polygon", "Polyline", "Point", "MultiPoint" ainsi que par la classe "Envelope". Les mthodes sont les suivantes :
12.3. TRANSFORMATIONS 2D
78/101
RowBuffer
IClass ITable IRow IRowEvents IValidate
Row
0..*
Table
Object
ObjectClass
Feature
0..*
FeatureClass
Pour crer une nouvelle entit (Feature) dans une classe d'entit (FeatureClass), on utilise la mthode "CreateFeature" sur IFeatureClass, qui cre un enregistrement vide. Pour que cette entit soit valide, il faut obligatoirement remplir le champ portant la gomtrie ("Shape") avec une gomtrie cre au pralable et cohrente avec le type de gomtrie de la FeatureClass. Pour ajouter un enregistrement dans une table sans gomtrie, on utilise la mthode CreateRow sur l'interface ITable. La mthode "Store" sur l'interface "IRow" (dont hrite "IFeature") enregistre les modifications effectues (crations ou modifications). Le code VBA ci-dessous montre un exemple d'ajout d'une entit une classe d'entit donne (celle associe la couche 0 de notre document). On suppose que la gomtrie pPoint as IPoint a t cre auparavant :
Dim pMxDoc as IMxDocument Set pMxDoc = ThisDocument Dim pFLayer as IFeatureLayer Set pFLayer = pMxDoc.FocusMap.Layer(0) Dim pFClass as IFeatureClass Set pFClass = pFLayer.FeatureClass Dim pFeature as IFeature Set pFeature = pFeatureClass.CreateFeature 'on cre une entit Set pFeature.Shape = pPoint 'on lui affecte une gomtrie pFeature.Store 'on enregistre
Remarque : Les attributs de l'entit autre que la gomtrie ne sont pas remplis dans cet exemple Pour modifier un champ, il suffit d'utiliser la mme proprit "Value" que pour lire un champ, puis utiliser la mthode "Store" :
pFeature.Value(pFClass.FindField("NOM_RUE_D")) = "RUE PRINCIPALE" pFeature.Store
79/101
La barre d'outil "Editeur" d'ArcMap est une extension l'application, fournissant les outils ncessaires l'dition des donnes vecteurs godatabase, shapefile ou couvertures. Les objets ArcObjects dcrivant cet "Editeur" permettent au dveloppeur de crer de nouveaux outils, modifier ou supprimer les outils existant ou personnaliser le comportement de l'application. On peut dcomposer les oprations d'dition en quatre types :
- les commandes : l'utilisateur n'a pas besoin de cliquer sur la carte (par exemple, la commande "Zone tampon" du menu "Editeur"). La plupart des commandes sont stockes dans le menu "Editeur".
- les outils : l'opration ncessite que l'utilisateur clique sur l'cran (par exemple, l'outil "Fractionnement" dans la barre d'outils "Editeur"). - les tches de mise jour : les tches rcuprent la gomtrie stocke dans une "construction" ("sketch") et excutent une opration spcifique partir de celle-ci (par exemple "Slectionner avec une ligne").
- les vnements de mise jour : ce sont les vnements spcifiques pouvant intervenir lors d'une session de mise jour. Par exemple, on va pouvoir grer les vnements lis la cration de nouvelles entits afin de raliser des contrles sur celles-ci.
L'objet principal du ArcMap Editor OMD est "l'Editor", qui implmente un certain nombre d'interfaces correspondant chacune un groupe de fonctionnalits, entre autres : IEditor, IEditLayers, IEditEvents, IEditProperties, IEditSketch, ISnapEnvironment : Pour effectuer une mise jour, l'utilisateur cre ou modifie une "construction" (EditSketch) avec les outils de construction. Lorsque la construction est termine (FinishSketch), sa gomtrie est passe la tche courante qui s'excute sur cette gomtrie.
80/101
Application
Editor
1..*
SnapAgent
1..*
EditTask
FeatureSnap
13.2.2.
Pour ouvrir une session d'dition, il faut au pralable rcuprer l'extension Editor, soit par son nom, soit par son CLSID (Unique Identifier Object) : Utilisation de FindExtensionByName :
Dim pEditor as IEditor Set pEditor = Application.FindExtensionByName("ESRI Object Editor")
Utilisation de FindExtensionByCLSID :
Dim Dim pID Set pEditor as IEditor pID As New esricore.UID = "esricore.Editor" pEditor = Application.FindExtensionByCLSID(pID)
L'ouverture et la fermeture d'une session d'dition se font grce aux mthodes "StartEditing" et "StopEditing" de l'interface "IEditor" et correspondent aux commandes "Ouvrir une session de mise jour" et "Quitter la session de mise jour" (Quitter enregistre alors les modifications dans la base de donnes). "StartEditing" prend comme paramtre le "Workspace" sur lequel on veut effectuer des oprations de mise jour. "StopEditing" prend en entre un boolen indiquant si on veut ou non sauvegarder les modifications. L'exemple VBA suivant montre comment ouvrir une session d'dition sur le workspace correspondant la premire couche vecteur de la carte, en vrifiant au pralable qu'aucune session d'dition n'est dj ouverte (on suppose qu'on a dj initialis pEditor) :
Dim pFeatureLayer As IFeatureLayer Dim pDataset As IDataset Dim pMap As IMap Dim pMxDoc As IMxDocument Dim LayerCount As Integer Set pMxDoc = Application.Document Set pMap = pMxDoc.FocusMap 'S'il n'y a pas de session d'dition ouverte If pEditor.EditState = esriStateNotEditing Then 'On ouvre une session d'dition sur la premire couche vecteur trouve For LayerCount = 0 To pMap.LayerCount - 1 If TypeOf pMap.Layer(LayerCount) Is IFeatureLayer Then Set pFeatureLayer = pMap.Layer(LayerCount) Set pDataset = pFeatureLayer.FeatureClass pEditor.StartEditing pDataset.Workspace Exit For End If Next LayerCount End If
81/101
13.2.3.
Les deux mthodes "StartOperation" et "StopOperation" permettent d'ajouter une opration la pile des "Annuler/Rpter". Elles permettent ainsi de donner un nom une opration annulable qui apparatra dans la commande "Annuler ..." du menu "Edition". Le code VBA ci-dessous montre l'utilisation de ces deux mthodes pour crer une opration annulable :
pEditor.StartOperation 'Insrer ici une suite d'instructions 'ralisant des opration de mise jour pEditor.StopOperation "Mon opration exemple"
82/101
Godatabase
Fichier Access 2000 (*.mdb)
Shapefile
Rpertoire o sont stocks les fichiers de forme
Couverture
"workspace", ie rpertoire o sont stockes les couvertures (il contient toujours un rpertoire INFO) Couverture Classe d'entit de type fixe : "arc", "polygon", "point", "node", "label" ...
Dataset FeatureClass
_________ Fichier de forme (en fait trois fichiers *.shp, *.shx, *.dbf)
Workspace des shapefile et couvertures Workspace de la godatabase Dataset (Jeu de classe d'entit de godatabase) FeatureClass (classe d'entit de godatabase)
FeatureClass (classe d'entit de godatabase en dehors d'un jeu de classes d'entits) Dataset (Couverture) FeatureClass ("classe d'entit" de couverture)
83/101
WorkspaceFactory
distribue des workspace et autorise les clients se connecter un workspace IDataset IFeatureWorkspace IWorkspace
Workspace
ArcInfoWorkspaceFactory
pour les ShapeFiles
0..*
IDataset
ShapeFileWorkspaceFactory AccessWorkspaceFactory
DataSet
Contient des jeux de donnes spatiales et non spatiales Jeu de donnes dans un Workspace
Table
IGeoDataset Dataset stockant des donnes gographiques IFeatureDataset IFeatureClassContainer Dataset stockant des donnes vecteur dans des FeatureClass
GeoDataSet ObjectClass
FeatureDataSet
IFeatureClass IGeoDataset INetworkClass
FeatureClass
Pour ajouter une couche un document ArcMap, il faut dans un premier temps rcuprer la classe d'entit (FeatureClass) correspondant la source des donnes ajouter. Pour cela, il faut passer par un "WorkspaceFactory" (une "usine" Workspace) qui va permettre d'instancier le "Workspace" correspondant la classe d'entit recherche. Le type de WorkspaceFactory est diffrent suivant le format des donnes (ArcInfoWorkspaceFactory, ShapefileWorkspaceFactory, AccessWorkspaceFactory, mais galement SDEWorkspaceFactory, OLEDBWorkspaceFactory etc ...). Toujours suivant le format des donnes, il faudra ou non ensuite passer par l'intermdiaire d'un FeatureDataset pour accder la classe d'entit (ce n'est pas la peine pour les shapefiles ou pour les classes d'entits de godatabase stockes en dehors d'un jeu de classes d'entits).
84/101
Rcupration du Workspace :
'On cre un objet ShapefileWorkspaceFactory pour accder au workspace qui nous
'intresse Dim pWFactory As IWorkspaceFactory Set pWFactory = New ShapefileWorkspaceFactory 'La mthode OpenFromFile renvoie un objet workspace sur l'interface IWorkspace. 'On fait une QI avec IFeatureWorkspace pour utiliser ensuite la 'mthode 'OpenFeatureClass. Dim pWorkspace As IFeatureWorkspace Set pWorkspace = pWFactory.OpenFromFile("D:\users\demo", 0) 'D:\users\demo est le chemin complet du rpertoire contenant le shapefile
Dim pFClass As IFeatureClass 'La mthode OpenFeatureClass prend en 'entre le nom du shapefile sans 'extension *.shp et renvoie un 'IFeatureClass Set pFClass = _ pWorkspace.OpenFeatureClass("villes")
85/101
NB : Le principe est le mme pour ajouter une classe d'entit de godatabase stocke en dehors d'un jeu de classes d'entits.
QI
pWFactory As IWorkspaceFactory pWFactory = New ArcInfoWorkspaceFactory 'couvertures pWorkspace As IFeatureWorkspace pWorkspace = pWFactory.OpenFromFile("D:\projet", 0)
Dim pFDataSet As IFeatureDataset Set pFDataSet = pWorkspace.OpenFeatureDataset("route") Dim pFCC As IFeatureClassContainer 'QI entre IFeatureDataset et IFeatureClassContainer Set pFCC = pFDataSet Dim pFClass As IFeatureClass 'Rcupration de la classe par son nom Set pFClass = pFCC.ClassByName("arc") Dim pFLayer As IFeatureLayer Set pFLayer = New FeatureLayer Set pFLayer.FeatureClass = pFClass 'le nom de la couche sera : route (arc) pFLayer.Name = pFDataSet.Name & " _ (" & pFClass.AliasName & ")" Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument pMxDoc.AddLayer pFLayer
NB : Le principe est semblable pour ajouter des classes d'entits de godatabase stockes dans un jeu de classes d'entits.
86/101
WorkspaceFactory
IDataset IFeatureWorkspace IWorkspace
IName
Name Workspace
0..*
DataSet
WorkspaceName
DataSetName Table
IGeoDataset
GeoDataSet ObjectClass
IFeatureDataset IFeatureClassContainer
FeatureDataSet
IFeatureClass IGeoDataset INetworkClass
FeatureClass
15.1.1.
Tout comme pour ouvrir une godatabase, on utilise un "WorkspaceFactory". On cre donc un nouvel objet "AccessWorkspaceFactory", puis on utilise la mthode "Create" qui prend en entre le nom du rpertoire de stockage de la godatabase et le nom de la godatabase. Cette mthode renvoie un objet "IWorspaceName" qui pemettra ensuite de travailler avec la godatabase.
Dim pAccessWFactory As IWorkspaceFactory Set pAccessWFactory = New AccessWorkspaceFactory Dim strMdbFolder As String, strMdb As String strMdbFolder = "d:\users" strMdb = "mygdb" Dim pWorkspaceName As IWorkspaceName Set pWorkspaceName = pAccessWFactory.Create _ (strMdbFolder, strMdb, Nothing, 0)
15.1.2.
Pour crer une classe d'entits, il est ncessaire de crer un champ qui va porter la gomtrie (champ "SHAPE" en gnral). A ce champ (objet "Field") est associ un objet "GeometryDef" qui permet de dcrire les paramtres spcifiques ce type de champ, entre autre la "SpatialReference". Outre la dfinition du systme de coordonnes (cf chap. 11.3), la "SpatialReference" dcrit le domaine X/Y et la prcision des coordonnes.
87/101
(extrait de Geodatabase OMD) Le code VBA suivant cre un objet "GeometryDef" qui sera utilis par la suite pour crer une classe d'entit de type "ligne", dans le sytme de coordonnes "Lambert II tendu" et dont le domaine X/Y est le suivant :
Dim pGeomDef As IGeometryDefEdit Set pGeomDef = New GeometryDef 'Cration de la SpatialReference partir d'un fichier .PRJ Dim pSpatRefFact As ISpatialReferenceFactory Set pSpatRefFact = New SpatialReferenceEnvironment Dim pSR As ISpatialReference Set pSR = pSpatRefFact.CreateESRISpatialReferenceFromPRJFile_ ("C:\arcgis\arcexe81\Coordinate systems\Projections Franaises\NTF Lambert II tendu.prj") 'Dfinition du domaine X/Y pSR.SetFalseOriginAndUnits 0, 0, 10 '(xmin=0, ymin=0, prcision de 1/10 de m) With pGeomDef .GeometryType = esriGeometryPolyline '(classe d'entit ligne) .GridCount = 1 .GridSize(0) = 10000 .AvgNumPoints = 2 .HasM = False .HasZ = False Set .SpatialReference = pSR End With
Rappel : Dans une godatabase, les coordonnes sont stockes sous forme d'entiers positifs sur 32 bits (ie entre 0 et 231=2147483647). Pour grer des coordonnes dcimales ou ngatives, il peut-tre ncessaire d'utiliser un facteur multiplicatif (la "prcision") et une translation (xmin et ymin diffrents de 0). Ces paramtres sont fixs grce la mthode
88/101
"SetFalseOriginAndUnits", les coordonnes de la carte sont converties par arcGIS comme suit pour tre stockes :
ArcGIS X = truncate ((( X coordinate - False X ) * xyunits ) + 0.5 ) ArcGIS X = truncate ((( Ycoordinate - False Y) * xyunits ) + 0.5 )
Une autre mthode pour dfinir le domaine est d'utiliser "SetDomain" qui fixe Xmin, YMin, XMax et YMax, la prcision tant alors calcule automatiquement partir de ces paramtres. Ainsi, pour dfinir une prcision de 1 :
pSR.SetDomain 0, 2 ^ 31 , 0, 2 ^ 31
15.1.3.
Cration de champs
Chaque table dans une godatabase possde une collection ordonne de champs ("Fields"), avec au moins un champ ("Field"). Chacune de ces deux classes implmente deux interfaces, l'une avec des proprits en lecture seule, l'autre avec les proprits quivalentes en criture seule (IField et IFieldEdit, IFields et IFieldsEdit). Pour crer une nouvelle collection de champs, on utilise IFieldEdit et IFieldsEdit. Suivant le type de champ cr, divers paramtres sont prciser (longueur pour du texte, GeometryDef pour un champ gomtrie, valeur par dfaut ...)
IField
Field
IFieldEdit
1..*
IFields IFieldsEdit
Fields
IClass ITable
Table
ObjectClass
FeatureClass
L'exemple VBA ci-dessous montre la cration de 3 champs "OID", "Shape" et "Nom" respectivement de types "Object ID", "Gomtrie" et "Texte". A noter l'utilisation de la mthode cache( ! ) "AddField" qui ajoute un champ une collection de champs :
Dim Set Dim Set Dim pNomField As IFieldEdit pNomField = New Field pShapeField As IFieldEdit pShapeField = New Field pOIDField As IFieldEdit
89/101
Set pOIDField = New Field pOIDField.Name = "OBJECTID" pOIDField.Type = esriFieldTypeOID pNomField.Name = "Nom" pNomField.Type = esriFieldTypeString pNomField.Length = 100 pShapeField.Name = "Shape" pShapeField.Type = esriFieldTypeGeometry Set pShapeField.GeometryDef = pGeomDef 'Ajout de ces champs une nouvelle collection de champs Dim pFieldsEdit As IFieldsEdit Set pFieldsEdit = New Fields pFieldsEdit.AddField pOIDField pFieldsEdit.AddField pShapeField pFieldsEdit.AddField pNomField
15.1.4.
CreateFeatureClass
La mthode "CreateFeatureClass" sur IFeatureWorkspace permet de crer une classe d'entit en passant en entre le nom de la classe d'entit, une collection de champs comportant un champ de type Gomtrie, le type d'entit cr (objets simples, rseau, annotations ou personnaliss) et le nom du champ portant la gomtrie. Il est indispensable de bien dfinir l'objet GeometryDef pour que la cration soit possible :
Set variable = object.CreateFeatureClass (Name, Fields, CLSID, EXTCLSID, FeatureType, ShapeFieldName, ConfigKeyword )
Les deux paramtres CLSID et EXTCLSID sont des "Global Unique Identifier" utiliss lorsqu'on souhaite crer des classes d'entits personnalises. Pour utiliser "CreateFeatureClass", il faut au pralable ouvrir le workspace. Le code VBA suivant utilise le "WorkspaceName" et les champs crs dans les paragraphes prcdents :
Dim pName As IName Set pName = pWorkspaceName 'QI entre IWorkspaceName et IName Dim pWorkspace As IWorkspace Set pWorkspace = pName.Open Dim pFeatureWorkspace As IFeatureWorkspace Set pFeatureWorkspace = pWorkspace 'QI Dim pfeatureClass As IFeatureClass Set pfeatureClass = pFeatureWorkspace.CreateFeatureClass _ ("myLignes", pFields, Nothing, Nothing, esriFTSimple, "shape", "")
La mthode pour crer une classe d'entit dans un jeu de classe d'entit est semblable, la mthode "CreateFeatureClass" s'appliquant "IFeatureDataSet". A noter toutefois que les rfrences spatiales doivent correspondre (toutes les classes d'entits d'un mme jeu de classes d'entits partagent les mmes rfrences spatiales). Ainsi, par exemple :
Dim pFeaturedataSet As IFeatureDataset Set pFeaturedataSet = pFeatureWorkspace.CreateFeatureDataset _ ("mydataset", pSR) Set pfeatureClass = pFeaturedataSet.CreateFeatureClass _ ("myLignes", pFieldsEdit, Nothing, Nothing, esriFTSimple, "shape", "")
90/101
Pour crer une table sans gomtrie, on utilise la mthode "CreateTable" qui prend les mmes arguments que "CreateFeatureClass" en entre, hormis le "feature type" et le ShapeFieldName".
'On suppose la couche pFLayer dj initialise ' Rcupration du DataSetName en entre Dim pFClass As IFeatureClass Set pFClass = pFLayer.FeatureClass Dim pDataSet As IDataset Dim pDSName As IDatasetName Set pDataSet = pFClass Set pDSName = pDataSet.FullName 'Dsignation de la classe d'entit en sortie Dim pWFactory As IWorkspaceFactory Set pWFactory = New ShapefileWorkspaceFactory 'export en fichier de forme Dim pWorkspace As IWorkspace Set pWorkspace = pWFactory.OpenFromFile("d:\users", 0) Dim pOutWName As IWorkspaceName Dim pOutDS As IDataset Set pOutDS = pWorkspace Set pOutWName = pOutDS.FullName Dim pOutFCName As IFeatureClassName Set pOutFCName = New FeatureClassName Dim pOutDSName As IDatasetName Set pOutDSName = pOutFCName pOutDSName.Name = "export_" & pFClass.AliasName Set pOutDSName.WorkspaceName = pOutWName 'Export Dim pExpOp As IExportOperation Set pExpOp = New ExportOperation pExpOp.ExportFeatureClass pDSName, Nothing, Nothing, Nothing, _ pOutDSName, Application.hWnd
Pour davantage de fonctionnalits, utiliser les objets "FeatureDataConverter", qui permettent de programmer des exports du type de ceux prsents dans ArcCatalog.
91/101
ICommandBars
CommandBars
1..*
ICommandBar ICommandItem
CommandBar
CommandItem
*
ICommandItem
CommandItem
Le module "ArcID du projet VBA pour le modle "Normal.mxt" est un utilitaire qui va permettre, pour un nom de commande pass en entre, de rcuprer l'UID correspondant. On utilise pour cela la mthode "Find" sur ICommandBars" ou "ICommandBar". La liste de l'ensemble des commandes ArcMap et ArcCatalog est fournie dans l'aide en ligne (Technical Documents/ Names and IDs of command and commandBars). L'exemple ci-dessous ouvre la bote de dialogue "Imprimer" (Menu Fichier/Imprimer) :
extrait d'ArcID
Public Property Get File_Print() As UID Dim u As New UID u = "{119591DB-0255-11D2-8D20-080009EE4E51}:7" Set File_Print = u End Property
Dim cbs As ICommandBars 'La mthode "CommandBars sur IDocument renvoie le commandbars associ au document Set cbs = ThisDocument.CommandBars 'Execution du CommandItem nomm "File_Print" cbs.Find(arcid.File_Print).Execute
93/101
Outre l'excution de commandes, on peut utiliser les "CommandBars" pour grer l'affichage des barres d'outils, notament grce la mthode "Dock" sur ICommandBar qui va permettre de spcifier la position et l'affichage ou non des barres d'outils. L"exemple ci-dessous affiche la barre de mise en page en dessous de la barre d'outils "Outils" : Dim cbs As ICommandBars Set cbs = ThisDocument.CommandBars Dim pToolBar As ICommandBar Set pToolBar = cbs.Find(arcid.PageLayout_LayoutToolbar) pToolBar.Dock esriDockBottom, cbs.Find(arcid.Tools_Toolbar) Remarque : il est impossible de cacher le CommandBar correspondant au "menu principal".
16.2.1.
La mthode "Create" sur ICommandBars permet de crer une barre d'outils ou un shortcut menu. Les barres d'outils ainsi cres sont visibles et en position flottante sur la page (esriDockFloat). Le code VBA ci-dessous cre une barre d'outil "Mes outils" puis ajoute deux commandes ArcMap existantes grce la mthode "Add" sur ICommandBar :
Sub CreateBar() Dim pCBs As ICommandBars Set pCBs = ThisDocument.CommandBars ' Cration de la nouvelle barre d'outils "Mes outils" Dim pNewBar As ICommandBar Set pNewBar = pCBs.Create("Mes outils", esriCmdBarTypeToolbar) 'On ajoute des commandes existantes la barre d'outils pNewBar.Add arcid.File_AddData pNewBar.Add arcid.PanZoom_FullExtent End Sub
16.2.2.
La mthode "CreateMenu" sur ICommandBar permet de crer des menu et sous-menus dans une barre d'outil ou un menu existant. Ce menu est vide lors de sa cration. On peut y ajouter des commandes existantes grce la mthode "Add", ou bien crer de nouvelles commandes avec la mthode "CreateMacroItem". Cette mthode permet d'excuter une procdure crite par l'utilisateur. L'exemple ci-dessous cre le menu suivant :
94/101
Public Sub CreateMenu() ' Recherche de la barre de menu principal Dim pMainMenuBar As ICommandBar Set pMainMenuBar = ThisDocument.CommandBars.Find(arcid.MainMenu) ' Cration du menu "MonMenu" dans la barre de menu principal Dim pNewMenu As ICommandBar Set pNewMenu = pMainMenuBar.CreateMenu("MonMenu") 'Ajout d'une commande ArcMap existante pNewMenu.Add arcid.File_AddData 'Cration d'une commande excutant la macro "MaMacro" pNewMenu.CreateMacroItem "Date et heure", 1, "Project.Module1.MaMacro" Cration d'un sous-menu "Requtes" Dim pSousMenu As ICommandBar Set pSousMenu = pNewMenu.CreateMenu("Requtes") 'Ajout de trois commandes ArcMap existantes pSousMenu.Add arcid.Query_AttributeSelect pSousMenu.Add arcid.Query_SelectByGraphics pSousMenu.Add arcid.Query_SelectFeatures End Sub 'Macro MyMacro affichant la date et l'heure dans un MsgBox Public Sub MaMacro() MsgBox Now 'Now = fonction VBA renvoyant la date et l'heure End Sub
Remarques : - les macros appeles par CreateMacroItem doivent tre des "Public Subs". - "CreateMacroItem comprend 3 arguments : le nom de la commande dans le menu, un numro de pictogramme, le nom complet de la macro VBA (y compris le nom du projet).
16.2.3.
La manipulation des menus contextuels fait appel aux vnements pouvant intervenir sur le document (ouverture de document, changement de vue active ...). L'vnement "OnContextMenu" s'excute lorsqu'un utilisateur clique avec le clic-droit sur l'cran (Display). Le code VBA ci-dessous remplace le menu contextuel qui s'affiche par dfaut lorsqu'on clique sur la carte par le menu "Slection". Le code doit tre crit dans le module "ThisDocument" du projet :
Private Function MxDocument_OnContextMenu(ByVal X As Long, _ ByVal Y As Long) As Boolean Dim pCBs As ICommandBars Set pCBs = ThisDocument.CommandBars Dim pMenu As ICommandBar 'On rcupre le menu "Selection_Menu" Set pMenu = pCBs.Find(arcid.Selection_Menu) 'et on l'affiche pMenu.Popup 'Revoie True pour tre pris en compte par l'application MxDocument_OnContextMenu = True End Function
95/101
Application
La proprit ProgressBar ainsi que les mthodes HideProgressBar, ShowProgressBar et StepProgressBar permettent de mettre en place une barre de progresion. La proprit ProgressAnimation ainsi que les mthodes HideProgressAnimation, ShowProgressAnimation et PlayProgressAnimation permettent de "faire tourner la terre" :
"Message"
"ProgressBar"
"ProgressAnimation"
L'exemple VBA ci-dessous met en place ces deux lments dans une boucle de 1 900000 :
Dim pStatusBar As IStatusBar 'On rcupre la barre d'tat de l'Application en cours Set pStatusBar = Application.StatusBar Dim i As Long 'On initialise la ProgressBar Dim pProgbar As IStepProgressor Set pProgbar = pStatusBar.ProgressBar pProgbar.Position = 0 'Et on l'affiche pStatusBar.ShowProgressBar "Loading...", 0, 900000, 1, True 'On initialise la ProgressAnimation Dim pProgAnim As IAnimationProgressor Set pProgAnim = pStatusBar.ProgressAnimation 'On l'affiche et on la fait tourner pProgAnim.Show pStatusBar.PlayProgressAnimation True 'Boucle de 1 900000 pour simuler un traitement For i = 0 To 900000 pStatusBar.StepProgressBar 'on fait avancer la ProgessBar Next 'On stoppe l'animation et on cache la barre et la terre pStatusBar.HideProgressBar pStatusBar.PlayProgressAnimation False pProgAnim.Hide
Remarque : il est galement possible de mettre en place des barres de progression dans des botes de dialogue en utilisant les objets "ProgressDialog".
96/101
Personnalisation ArcCatalog
QI
IGxObjectFilterCollection
97/101
Personnalisation ArcCatalog
L'exemple VBA suivant cre une bote de dialogue de type "Ouvrir" permettant l'utilisateur de ne slectionner que les fichiers de forme et les fichiers de couche. Un MsgBox affiche ensuite le type de fichier et son nom complet :
Dim pGxDialog As IGxDialog Set pGxDialog = New gxdialog 'On autorise la slection de plusieurs fichiers pGxDialog.AllowMultiSelect = True pGxDialog.Title = "Ouvrir un fichier de forme _ ou un fichier de couche ..." Dim pShpFilter Dim pLyrFilter 'Cration d'un Set pShpFilter 'Cration d'un Set pLyrFilter As IGxObjectFilter As IGxObjectFilter filtre pour les fichiers de forme = New GxFilterShapefiles filtre pour les fichiers de couche = New GxFilterLayers
Dim pFilterColl As IGxObjectFilterCollection 'QI entre IGxDialog et IGxObjectFilterCollection Set pFilterColl = pGxDialog 'On ajoute les filtres la collection pFilterColl.AddFilter pShpFilter, True pFilterColl.AddFilter pLyrFilter, False Dim pEnumGx As IEnumGxObject pGxDialog.DoModalOpen ThisDocument.Parent.hWnd, pEnumGx Dim str As String pEnumGx.Reset Dim pGxObj As IGxObject Set pGxObj = pEnumGx.Next 'Parcours des objets slectionns Do Until (pGxObj Is Nothing) str = str & Chr(13) & pGxObj.Category & ": " & _ pGxObj.FullName Set pGxObj = pEnumGx.Next Loop MsgBox "fichiers choisis : " & Chr(13) & str
Application
IGxSelection
GxSelection
Le code VBA ci-dessous montre comment parcourir et obtenir des informations sur les objets slectionns dans ArcCatalog grce un IEnumGxObjects :
Dim pGxApp As IGxApplication 'QI entre IApplication et IGxApplication Set pGxApp = Application 'Recupration de la slection
98/101
Personnalisation ArcCatalog
Dim pGxSel As IGxSelection Set pGxSel = pGxApp.selection Dim pEnumGx As IEnumGxObject Set pEnumGx = pGxSel.SelectedObjects 'Parcours de la slection Dim pGxObj As IGxObject Dim str As String Set pGxObj = pEnumGx.Next Do While Not pGxObj Is Nothing str = str & Chr(13) & pGxObj.Name Set pGxObj = pEnumGx.Next Loop 'On affiche le nom des objets slectionns MsgBox str
17.3. GXVIEW
GxView est une Abstract Class qui reprsente toutes les vues possibles d'ArcCatalog. Il existe cinq sous-classes de GxView :
*
GxView
GxTableView GxTreeView
GxPreview
Aperu des objets slectionns
GxContentsView
GxDocumentationView
IGxGeographicView IGxGeographicView2
GxGeographicView
L'exemple VBA suivant montre l'uilisation de GxPreview et GxGeographicView. On vrifie dans un premier temps que l'utilisateur d'ArcCatalog est bien en mode "Aperu" puis, si c'est le cas, qu'il est bien en mode aperu "Gographie". Enfin, on rcupre l'"ActiveView" et on modifie son extension, afin de d-zoomer sur l'aperu :
Public Sub ZoomIn() Dim pGxApp As IGxApplication Set pGxApp = Application 'QI 'Si on n'est pas dans l'onglet "Aperu", 'on sort de la procdure If Not TypeOf pGxApp.View Is IGxPreview _ Then Exit Sub Dim pPreview As IGxPreview Set pPreview = pGxApp.View 'Si on n'est pas en mode aperu "Gographie" 'on sort de la procdure If Not TypeOf pPreview.View Is IGxGeographicView _ Then Exit Sub Dim pGeoView As IGxGeographicView2 'On rcupre alors la "view" 'et l'activeview correspondante Set pGeoView = pPreview.View Dim pExtent As IEnvelope Set pExtent = pGeoView.ActiveView.Extent 'On rduit l'extent de faon d-zoomer pExtent.Expand 0.75, 0.75, True pGeoView.ActiveView.Extent = pExtent pGeoView.ActiveView.Refresh End Sub
99/101
index
18. index
Abstract Class................................................. 22 AccessWorkspaceFactory............................... 86 ActiveView..................................................... 31 AddField......................................................... 93 AddPoint......................................................... 43 Annuler........................................................... 84 AppDisplay..................................................... 47 Application ..................................................... 30 ArcID.............................................................. 97 ArcInfoWorkspaceFactory ............................. 86 Association ..................................................... 25 batch ............................................................... 97 ByRef ............................................................. 18 ByVal ............................................................. 18 cache............................................................... 48 CartographicLineSymbol ............................... 54 Class ............................................................... 23 CoClass........................................................... 24 ColorRamp ..................................................... 51 ColorSelector.................................................. 52 COM .............................................................. 19 CommandBar ................................................. 97 CommandBars ................................................ 97 CommandItem ................................................ 97 Composition ................................................... 25 contrles ......................................................... 13 CreateESRISpatialReferencefromPRJFile ..... 75 CreateFeature.................................................. 81 CreateFeatureClass ......................................... 94 CreateMacroItem............................................ 99 Curseur ........................................................... 38 cursor.............................................................. 38 Densify ........................................................... 75 DoModalOpen .............................................. 103 DoModalSave............................................... 103 Editor.............................................................. 82 Element........................................................... 65 numrateur .................................................... 33 Enumration ................................................... 37 EnumVertices ................................................. 45 evenement....................................................... 40 vnements ..................................................... 99 ExportOperation ............................................. 95 Feature............................................................ 35 FeatureClass ................................................... 35 FeatureCursor ................................................. 38 FeatureDataSet ............................................... 88 FeatureRenderer ............................................. 59 feuilles ............................................................ 13 FindExtensionByCLSID................................. 83 FindExtensionByName................................... 83 Font ................................................................ 57 FrameElement ................................................ 66 FromPoint....................................................... 42 GeometryDef ..................................................91 GetFeature.......................................................37 Global variables scope ....................................30 GraphicElement ..............................................65 GroupElement .................................................66 GxDialog.......................................................103 GxObjectFilter ..............................................103 Hritage...........................................................24 IActiveViewEvents .........................................40 ICmykColor ....................................................51 IColor ..............................................................52 IEditor .............................................................83 IEnumColors ...................................................61 IEnumGxObject ............................................103 IEnumVertex...................................................45 IFeatureClass ..................................................36 IFeatureSelection ............................................38 IField...............................................................93 IFieldEdit ........................................................93 IFormattedTextSymbol ...................................57 IGeoFeatureLayer ...........................................62 IGraphicsContainer .........................................68 IMapFrame......................................................66 IMapSurroundFrame.......................................66 Implements ....................................................20 Instantiation ....................................................25 Interface ..........................................................19 Interface Inheritance .......................................29 interfaces.........................................................19 Invalidate ........................................................48 IPointCollection ..............................................43 IProjectedCoordinateSystem...........................74 IProximityOperator .........................................79 IRelationalOperator.........................................80 IRgbColor .......................................................51 IScreenDisplay................................................47 ISelectionSet ...................................................38 ISpatialFilter ...................................................77 ISpatialReferenceFactory................................74 ITopologicalOperator......................................78 IWorspaceName..............................................91 Layer ...............................................................32 LineDecoration ...............................................53 macros.............................................................13 Map .................................................................31 MapFrame.......................................................66 MapInsetWindow............................................47 MapSurroundFrame ........................................66 module de classe .............................................20 MxDocument ..................................................30 New.................................................................24 Nothing ...........................................................32 ObjectClass .....................................................35 OMD ...............................................................19
100/101
index
OnContextMenu ............................................. 99 PageLayout..................................................... 31 pan .................................................................. 72 PartialRefresh ................................................. 48 PictureAspectRatio ......................................... 69 PictureMarkerSymbol .................................... 53 polymorphisme............................................... 20 Project............................................................. 75 QI....................................... Voir Query Interface Query Interfaces ............................................. 21 QueryFilter ............................................... 38, 39 Rafraichissements........................................... 48 Recycling........................................................ 39 Refresh ........................................................... 48 ScreenDisplay................................................. 47 SelectionSet .................................................... 38 Set............................................................. 27, 28 SetDomain ...................................................... 93 SetFalseOriginAndUnits................................. 93 ShapefileWorkspaceFactory........................... 86 sketch.............................................................. 82 SpatialFilter .............................................. 38, 77
SpatialReference .............................................74 SpatialRel........................................................77 StartEditing .....................................................83 StartOperation .................................................84 StatusBar.......................................................100 StopEditing .....................................................83 StopOperation .................................................84 Store................................................................81 TextSymbol.....................................................55 ThisDocument.................................................30 tooltip ..............................................................11 ToPoint ...........................................................42 TypeOf ............................................................32 UIControl ........................................................10 UID .................................................................97 UML ...............................................................21 Userform .........................................................13 Value...............................................................37 WithEvents......................................................40 Workspace ......................................................86 WorkspaceFactory ..........................................86
Bibliographie
- Modeling our World - The ESRI Guide to Geodatabase Design - Michal Zeiler - ed. ESRI Press - Programmer ArcInfo avec VBA - Support de cours ESRI France 2000 - Exploring ArcObjects volumes 1 et 2 - ed. Michael Zeiler
Ou trouver de l'aide ?
http://support.esrifrance.fr/ http://arcobjectsonline.esri.com/ liste de diffusion arcsig@georezo.net (inscription : arcsig-subscribe@georezo.net)
101/101