programmation d`ArcGIS avec VBA
Transcription
programmation d`ArcGIS avec VBA
Initiation à la programmation d’ArcGIS avec VBA Hervé BOHBOT v. 1.9 – décembre 2011 HB – Programmation d’ArcGIS – Support de cours Hervé BOHBOT Ingénieur de recherche, SIG et télédétection Archéologie des Sociétés Méditerranéennes – CNRS UMR 5140 390, avenue de Pérols – 34970 Lattes 04 67 15 61 35 – 04 67 22 55 15 – [email protected] 1 Sommaire Introduction 3 1ère partie – Principes 1. Personnalisation de l'interface d'ArcGIS 2. Rappels sur la programmation avec VBA 3. Introduction à ArcObjects 4. Le modèle objet d’ArcGIS 4 8 13 18 2ème partie - Développements thématiques 5. Sources de données (accès, création) 6. Filtres, curseurs et sélections 7. Géométrie et géotraitements 8. Symboles et représentation des données 9. Contrôles outils et événementiels 10. Eléments de mise en page 25 36 42 52 62 69 Annexes 76 2 Introduction Pourquoi programmer avec ArcGIS ? On a souvent besoin d’une fonction non fournie en standard. L L’utilisation utilisation de programmes faits par d’autres d autres est parfois frustrante. frustrante Pour être autonome. Il est valorisant de créer ses propres outils. De la simple personnalisation de l’interface à la construction d’une nouvelle application, tout est possible. Objectifs de ce cours Expliquer les principaux concepts de manière pratique. Présenter une vue générale de ce qu’il est possible de faire. Permettre de comprendre et d’adapter des programmes existants. Donner des clés pour s’approprier le logiciel. Donner envie de faire ses propres programmes et d’aller plus loin. 5 HB – Programmation d’ArcGIS – Support de cours 3 1. Personnalisation de l’interface d’ArcGIS HB – Programmation d’ArcGIS – Support de cours Sommaire La boîte de dialogue « Personnaliser » Rappel sur le langage Visual Basic pour Applications Notions de programmation objet : objets, propriétés et méthodes L'éditeur Visual Basic 8 HB – Programmation d’ArcGIS – Support de cours 4 Personnalisation et développement L’environnement de développement d’ArcGIS est constitué de plusieurs outils : La boîte de dialogue « Personnaliser » (modification de l’interface utilisateur). Model builder : interface graphique pour enchaîner des traitements. Scripts Python : géotraitements sans interface graphique. AddIn : développés avec Visual Studio Express pour .NET, ou Eclipse pour Java. L’éditeur VBA pour créer des formulaires, boîtes de dialogue, rédiger du code. Tout document ArcMap est basé sur un modèle de document : par défaut normal.mxt ou un modèle personnalisé. La sauvegarde des personnalisations peut se faire au niveau du : Document ArcMap courant (Project *.mxd) Modèle général de document (Normal template : normal.mxt) mxd = document ArcMap – mxt = modèle de document ArcMap (template) gxt = paramètres et environnement d’ArcCatalog 9 HB – Programmation d’ArcGIS – Support de cours Boîte de dialogue Personnaliser Menu Personnaliser / Mode personnalisation Gestion des barres d’outils et des boutons de commande (création, suppression). Affectation de commandes prédéfinies ou personnalisées à des boutons. p de p programmes g complémentaires p (p (plug g in). ) Importation Création de raccourcis clavier. UIControls : contrôles d’interface utilisateur (UI) Permet d’importer un plug in utilisateur. Par défaut : personnalisation du document en cours. 10 HB – Programmation d’ArcGIS – Support de cours 5 Visual Basic pour Applications VBA : environnement de développement intégré (EDI) à une application. Version simplifiée du langage Visual Basic (Visual Studio VB.net) Adopté par de nombreux logiciels : Microsoft Office (Word, (Word Access Access, Excel Excel...), ) AutoCAD, Statistica, Visio... En connaissant VBA, il « suffit » de se familiariser avec la bibliothèque d’objets d’ArcGIS pour commencer à programmer. Évolution par rapport aux langages propriétaires présents dans les premières versions d’ArcView et ArcInfo : Arc Macro Language (ArcInfo) Avenue (ArcView) VBA Depuis 10 ans, une énorme quantité de scripts disponibles... … mais une fin programmée par ESRI (version 11 ?). PYTHON : langage de script Editeur Python IDLE fourni avec ArcGIS (fichiers *.py dans \Programmes\ArcGIS\Desktop10.0\arcpy). 11 Éditeur Visual Basic HB – Programmation d’ArcGIS – Support de cours Menu Outils / Macros / Editeur Visual Basic ou Alt-F11 pour lancer VBE Explorateur de projet Propriétés de la feuille Formulaire personnalisé (feuille) 12 Code associé à la feuille HB – Programmation d’ArcGIS – Support de cours 6 Notions de programmation objet (I) Méthode de programmation se rapprochant du monde réel : composé d’objets : une carte, une voiture... possédant des propriétés (ou champs, attributs) : une échelle, une couleur… supportant des actions, appelées méthodes (procédures et fonctions) : zoomer, démarrer... répondant à des événements (clic, contact) les affectant. Les objets sont regroupés en classes (Cartes, Voitures) possédant les mêmes propriétés, méthodes et événements. La syntaxe des instructions est de la forme : objet.méthode, objet.propriété P Programmation ti : manipulation i l ti « d’instances d’i t » (exemples) ( l ) d’élé d’éléments t d’ d’une classe) d’objets. D’où les mots instancier, instanciable, instanciation. ArcGIS utilise des objets d’interface Windows comme les barres d’outils, les boîtes de dialogue, les boutons de commande mais aussi des objets spécifiques comme des couches vectorielles, des tables ou des symboles cartographiques. 13 HB – Programmation d’ArcGIS – Support de cours Exercice 1 Découverte de l’éditeur VBA. Création d’un formulaire. Définitions f de propriétés d’objets ’ de l’interface ’ f utilisateur. Création d’une procédure événementielle. Ajout d’un bouton de barre d’outils à l’interface d’ArcMap. 14 HB – Programmation d’ArcGIS – Support de cours 7 2. Rappels sur la programmation en VBA HB – Programmation d’ArcGIS – Support de cours Sommaire Variables Constantes Procédures et fonctions Opérations courantes Tests conditionnels Boucles Manipulation d’objets 16 HB – Programmation d’ArcGIS – Support de cours 8 Variables Option Explicit en tête de module: force la déclaration de toutes les variables. Types et conventions de nommage Déclaration et portée Type Préfixe Description String str Chaîne de caractères Valeur Boolean f Logique True ou False Date dtm Date #31/12/1999# Byte byt Octet 0 à 255 Integer int Entier -32768 à 32767 Long l Entier long ± 29 Mot réservé Déclaration Portée Vie Dim Procédure Procédure Procédure Static Procédure Procédure Application Single sng Réel simple ± 10-38 à 1045 ~ Private Module Module Application Double dbl Réel double ± 10-324 à 10308 ~ Public Module Projet Application Variant var Variant Toutes sortes… Exemples de déclarations ( initialisation) Public lCount as Long Dim strToto as String, strTata as String Dim strToto, strTata as String Tableaux (dimension définie ou non lors de la création) Dim strNoms() as String -> ReDim Dim intNombres(12) as Integer -> 0 à 12 17 HB – Programmation d’ArcGIS – Support de cours Constantes Valeurs numériques ou chaînes de caractères invariantes : lisibilité du programme améliorée, maintenance facilitée. Prédéfinies (dites intrinsèques) : leur nom commence par le préfixe vb Définition des boîtes de dialogue (MsgBox) : boutons (vbOkOnly, vbYesNo…), icônes (vbExclamation, vbCritical…), bouton par défaut (vbDefaultButton1…) Valeur retournée par MsgBox (vbOk, vbCancel, vbYes…) Retour à la ligne : vbCrLf, vbNewLine Définies par l’utilisateur Déclaration au niveau d’un module ou d’une procédure Forme générale : [Public | Private] Const NomConstante [As Type] = expression Exemples Const cstPi = 3.14159 Private Const cstCentimetresParPouce as Single = 2.54 18 HB – Programmation d’ArcGIS – Support de cours 9 Procédures et fonctions Procédure Série d’instruction ne renvoyant pas de valeur via son nom mais susceptible d’échanger des informations avec le programme appelant via des paramètres. Private Sub MaProc(strMessage as String) MsgBox strMessage E d S End Sub b Appel : MaProc "Bonjour" Procédure évènementielle Procédure associée à un évènement sur un objet : object_évènement(paramètres) Private Sub cmdBouton_Click() ‘code exécuté lorsqu’on clique le bouton cmdBouton End Sub Appel : automatique lorsque l’évènement se réalise. Fonction Série d’instructions renvoyant y une valeur via son nom. Private Function Moitie(dblNum as Double) as Double Moitie = dblNum / 2 End Function Appel : dblTest = Moitie(10) Si la valeur renvoyée n’est pas utilisée, s’utilise comme une procédure (sans parenthèses). Sortie prématurée de procédure/fonction : Exit Sub ou Exit Function Passage d’arguments par référence (ByRef, défaut) ou par valeur (ByVal) 19 HB – Programmation d’ArcGIS – Support de cours Quelques opérations courantes Fonctions de manipulation de chaînes de caractères (avec variable strVille = "Montpellier") Fonctions de manipulation de nombres Opérations arithmétiques : +, -, *, / Puissance: ^ Pour une valeur numérique n : CStr(n) Conversion de n en chaîne de caractères Fix(n) Partie entière de n Round(n, x) Arrondi de n à x décimales Sqr(n) Racine carrée de n Abs(n) Valeur absolue de n Sin(n), Cos(n), Tan(n), Atn(n)... Fonctions trigo Transformation d'une chaîne en nombre : Val(chaîne) Tester une variable IsNumeric(variable) Convertir une chaîne en majuscules, minuscules : UCase(strVille) "MONTPELLIER" LCase(strVille) "montpellier" Extraire des parties d'une chaîne : Right(strVille, 3) "ier" Left(strVille, 4) "Mont" Mid(strVille, 3, 4) "ntpe" Calculer la longueur d'une chaîne : Len(strVille) 11 LBound(tabToto) et UBound(tabToto) renvoient les indices minimum et maximum d'un tableau. Remplacer une chaîne par une autre : Replace(strVille, Replace(strVille "pel", "pel" "o") "Montolier" IsDate(uneDate) teste si uneDate peut être interprêté comme une date. Tester la présence d'une chaîne dans une autre (renvoie la position ou 0) : InStr(strVille, "p") 5 Opérateur & convertit en chaîne de caractères et concatène les 2 opérandes : "Montpellier a " & 250000 & " habitants." "Montpellier a 250000 habitants." 20 HB – Programmation d’ArcGIS – Support de cours 10 Instructions conditionnelles If… Then… Else… If condition Then instructions ‘instructions [Else ‘autres_instructions] End If Select Case Remplacement de ElseIf si l’expression à comparer peut prendre plusieurs valeurs. valeur peut être une valeur discrète (1), une énumération (2,3), un intervalle (4 To 6), un test (Is > 6) 21 If condition Then ‘instructions [ElseIf condition-n Then ‘InstructionsElseIf InstructionsElseIf Else ‘InstructionsElse] End If Select Case ExpressionTest Case valeur ‘instructions Case valeur-n valeur n ‘instructions-n Case Else ‘instructions End Select HB – Programmation d’ArcGIS – Support de cours Boucles For … Next Répétition d’un bloc d’instructions un certain nombre de fois (selon une variable incrémentée ou décrémentée à chaque itération). For i = 2 To 10 Step 2 instructions Next i Si omission de Step le pas par défaut est de un. Do … Loop Répétition d’un bloc d’instructions tant qu’une condition est remplie (While) ou jusqu’à ce qu’elle le soit (Until) Do {While | Until} condition instructions Loop Sortir d'une boucle prématurément (à utiliser avec parcimonie et bon escient) Exit For ou Exit Do : passage à la première instruction suivant le mot-clé Next ou Loop). 22 HB – Programmation d’ArcGIS – Support de cours 11 Manipulation d’objets Set pObjet = New nomClasse Création d’un nouvel objet (ou instance) du type de la classe nomClasse, qui sera manipulable via la variable (ou pointeur) pObjet avec la notation pObjet.methode ou pObjet.propriete Set p2Objet = p1Objet Affectation de la référence de p1Objet à p2Objet : les 2 pointeurs désignent le même objet. On obtient ainsi 2 alias sur un même objet, le nouvel alias (p2Objet) étant souvent plus abrégé que le pointeur préexistant (souvent issu d’une fonction) p1Objet Is p2Objet L'expression est vraie si les deux variables pointent vers le même objet. TypeOf pObjet Is nomClasse L' L'expression i estt vraie i sii lla variable i bl pObjet Obj t supporte t la l classe l ((existante) i t t ) indiquée par nomClasse. Nothing Mot-clé utilisé pour savoir si une variable contient effectivement la référence à un objet (if pObjet Is Nothing Then) ou pour supprimer la référence à un objet (Set pObjet = Nothing) 23 HB – Programmation d’ArcGIS – Support de cours 12 3. Introduction à ArcObjects HB – Programmation d’ArcGIS – Support de cours Sommaire Présentation des ArcObjects Présentation de la norme COM Programmation objet (2ème partie) : encapsulation et polymorphisme Utilisation des méthodes et propriétés Le « changement d'interface » Programmation objet (3ème partie) : l'héritage 26 HB – Programmation d’ArcGIS – Support de cours 13 ArcObjects ArcGIS est développé à partir de composants logiciels programmables s’appuyant sur la norme COM (Component Object Model) développée par Microsoft. création et utilisation indépendante du langage programmation de programmation. ArcInfo Ex : les ArcObjects sont programmés en C++ et utilisés dans ce cours en VB pour Application. ArcEditor ArcView ArcGIS Engine Extensions Spatial Analyst Geostatistical Analyst 3D Analyst y ... ArcGIS Desktop ArcGIS Server 27 HB – Programmation d’ArcGIS – Support de cours Programmation des ArcObjects Bibliothèques d’objets (fichiers *.OLB) L Langage d de programmation ti VBA, VB.NET, C#, Java, VC++ Exemple d’utilisation de la classe Point définie dans la librairie esriGeometry.olb Dim pPoint As esriGeometry.Ipoint Set pPoint = New esriGeometry.Point ou tout simplement... Dim pPoint As IPoint Set pPoint = New Point Menu Outils / Références de l’éditeur VBA L’ensemble des objets a été décrit en 80 bibliothèques (object libraries). Il faut indiquer à l’interface de développement qu’il faut utiliser ces références pour que les classes d’objets correspondantes soient reconnues. 28 HB – Programmation d’ArcGIS – Support de cours 14 Présentation de la norme COM COM est une norme de création de classes d’objets. Les classes développées selon cette norme peuvent être utilisées par de nombreuses applications. Les es objets obje s COM CO d’une d u e application app ca o peuvent peu e être ê e utilisés u sés dans da s une u e autre au e application. app ca o De nombreuses technologies s’appuient sur la norme COM : OLE, OLEDB, ActiveX, DirectX, DCOM… Principe CHIEN Les objets COM « communiquent », indépendamment du IChien Nom: String langage qui a servi à les créer, uniquement à l’aide de leurs « interfaces ». Aboyer Grogner Une interface regroupe des propriétés et des méthodes. Un objet peut avoir une ou plusieurs interfaces. IAnimal Couleur: String L’utilisation d’interfaces facilite la mise à jour du code. Manger Les interfaces peuvent être rendues visibles ou cachées au développeur. Dans la « base de registres » de Windows: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface 29 Programmation Objet HB – Programmation d’ArcGIS – Support de cours deuxième partie Encapsulation Les propriétés et méthodes sont implémentées au sein i d' d'une structure non accessible ibl di directement. Empêche l'accès aux données par un autre moyen que les services proposés (définis par l’interface). Garantit l'intégrité des données contenues dans l'objet. Polymorphisme Des classes différentes peuvent partager la même interface interface. L’implémentation des méthodes et propriétés se fait dans le module de classe et non dans l’interface. Les objets peuvent donc répondre différemment. 30 CHIEN IChien Aboyer IAnimal Manger OISEAU IOiseau Chanter IAnimal Manger HB – Programmation d’ArcGIS – Support de cours 15 Utilisation des méthodes et des propriétés 1. Déclaration d’une variable qui pointe vers l’interface désirée. 2. Affectation à un objet qui présente cette interface : - Nouvel objet créé (instancié) avec le mot clé New. éé par une propriété iété ou méthode éth d d’ bj t existant. i t t - Obj Objett créé d’un objet - Objet existant déjà pointé par une autre variable. 3. Appel de méthode, définition ou récupération d’une valeur de propriété. CHIEN IChien Aboyer Objet (« serveur ») Requête pour un service Programme (« client ») 31 HB – Programmation d’ArcGIS – Support de cours Le « changement d’interface » (Query interface) Une variable permet d’accéder aux propriétés et méthodes d’une interface donnée (le type déclaré). Pour atteindre des propriétés et méthodes situées sur une autre interface du même objet objet, une autre variable est nécessaire pour réaliser ce changement d’interface (noté CI ou QI). CHIEN ‘Création d’un nouvel objet «chien» Dim pChien As IChien Set pChien = New Chien pChien.Nom = "Médor" ‘ok pChien.Manger ‘cause une erreur ! IChien Aboyer Grogner CI ‘Changement d’interface pAnimal As IAnimal Dim p Set pAnimal = pChien pAnimal.Manger pChien.Grogner Nom: String IAnimal Couleur: String Manger Les variables pChien et pAnimal pointent vers le même objet : pChien Is pAnimal est Vrai 32 HB – Programmation d’ArcGIS – Support de cours 16 Programmation Objet troisième partie Héritage de type L'héritage permet de transférer à une classe toutes les té i ti d' t classe. l L l d ll caractéristiques d'une autre La classe dontt elle hérite est appelée classe mère (ou classe de base, classe antécédente). La classe elle-même est appelée classe fille (ou classe dérivée, descendante). Les interfaces héritées contiennent les propriétés et les méthodes de la classe mère. ANIMAL IAnimal C l St i Couleur: String Manger « est un type de » Une classe fille peut redéfinir une méthode héritée. CHIEN Dim pAnimal As IAnimal Set pAnimal = New Chien IChien Dim strCouleur As String strCouleur = pAnimal.Couleur Nom: String Aboyer IAnimal Grogner Pas de programmation d’héritage avec VBA. Il faut utiliser VB.net, VC++… 33 HB – Programmation d’ArcGIS – Support de cours Exercice 2 Utilisation d'interfaces Création et implémentation de classes d'objet Création C d'interfaces f 34 HB – Programmation d’ArcGIS – Support de cours 17 4. Le modèle objet d’ArcGIS HB – Programmation d’ArcGIS – Support de cours Sommaire Présentation des diagrammes de modèles objet (ArcObjects OMD). Légende et conventions graphiques des diagrammes. Les types de classes et leurs relations. Lecture et écriture de propriétés. 36 HB – Programmation d’ArcGIS – Support de cours 18 Modèle objet : vue générale Les classes d’objets sont représentées sur des diagrammes (OMD : Object Model Diagrams) qui décrivent : leurs interfaces, p propriétés p et méthodes, les types de relations entre elles (représentation type UML), si et comment les objets peuvent être créés. Les diagrammes d’ArcGIS sont fournis au format PDF C:\Program Files\ArcGIS\DeveloperKit10.0\Diagrams Il existe une centaine de diagrammes (un ou plusieurs par fichier) Leurs noms et leur répartition changent selon les versions d’ArcGIS. Il faut apprendre à naviguer dedans et à les interpréter : Indispensable I di bl pour rédiger édi d du code. d Ce qui fait beaucoup de propriétés et méthodes... 37 HB – Programmation d’ArcGIS – Support de cours Aide d’ArcGIS Developer Aide en ligne : http://help.arcgis.com/en/sdk/10.0/vba_desktop/ao_home.html Quelques fichiers PDF des modèles objet Diagrammes Thème Diagrammes correspondants C:\Program Files\ArcGIS\DeveloperKit10.0\Diagrams ArcCatalog ArcCatalog, Catalog, CatalogUI... regroupés dans un fichier AllDesktopOMDs_10.pdf ArcMap ArcMap, ArcMapUI, Carto (Map) 38 Symbologie Sy g Display p y (Sy (Symbols), ), C Carto ((Rendering)... g) Structures de données Geodatabase, DataSources... Géométrie Geometry... Couches Carto (Layers)... Sorties (impression, export) Output, OutputUI, Output Extensions... Mise en page cartographique Carto (Map and Page), Map Elements... Références spatiales Geometry (Spatial reference) HB – Programmation d’ArcGIS – Support de cours 19 Les trois sortes de classes et leur relations Class X in Y « Passerelle » vers un autre diagramme Interface événementielle Interface connectée à l’extérieur de la boîte : détaillée (ou pas) sur un autre diagramme, en bas de page ou sur un autre objet. Conventions graphiques 39 HB – Programmation d’ArcGIS – Support de cours Classe « abstraite » (AbstractClass) On ne peut créer (instancier) d’objet de cette classe. Symbole : rectangle légèrement grisé. Définit des interfaces, propriétés et méthodes générales dont héritent ses classes filles. Ex: la classe abstraite Layer (couche) possède de nombreuses classes filles correspondant aux différents types de couches. Relation d’héritage de type « est un type de » Héritage d’interface etc. Héritage d’interface Une interface peut hériter directement d’une autre : accès à ses propriétés et méthodes sans changement d’interface. 40 HB – Programmation d’ArcGIS – Support de cours 20 Classes « concrètes » Bloc de données On peut créer (instancier) un objet de ces classes. Sont de deux types suivant la méthode d’instanciation. * CoClass (Component Object class) Symbole : rectangle 3D grisé. Instance de cette classe créée : - avec le mot-clé New (creatable) Document ArcMap Dim pMap as IMap Set pMap = New Map - à l’aide d’une propriété ou méthode d’une autre classe (instantiable) Dim pMap as IMap Set pMap = pMxDoc.FocusMap Class (Regular Cl (R l Class) Cl ) Symbole : rectangle 3D blanc. Instanciée uniquement à partir d’une autre classe. ligne « crée un » Dim pRow as IRow Set pRow = pTable.CreateRow Relation d’instanciation 41 HB – Programmation d’ArcGIS – Support de cours Relations entre classes MxDocument Composition L’objet de la classe "parent " conditionne l’existence d’objets j de la classe "enfant ". * * Layer Map Association Simple relation entre 2 classes indépendantes l’une de l’autre. Une propriété ou méthode de l’une renvoie un pointeur sur une interface de l’autre. Ring * Polygon Path boucle: suite de segments t fermée f é Polyline * chemin: suite de segments t ouverte t La cardinalité est indiquée de part et d’autre des relations de composition ou d’association 42 (rien) Un et un seul 0..1 0 ou 1 objet m..n m objets reliés à n autres * ou 0..* De 0 à plusieurs 1..* De 1 à plusieurs HB – Programmation d’ArcGIS – Support de cours 21 Lecture et écriture des propriétés Affectation d d’un un pointeur Affectation d’un scalaire { Propriétés en lecture seule partie gauche : lecture Lecture d’une propriété retournant une valeur scalaire (Boolean, Long, String ...) : directement ec e e d Dim lNbLayers As Long lNbLayers = pMap.LayerCount partie droite : écriture Affectation d’une valeur scalaire (String, Boolean...) : directement pMap.IsFramed = False Lecture d’une propriété retournant un pointeur sur une interface (ILayer, ISelection ...) : utiliser le mot-clé Set) Dim pLayer as ILayer Set pLayer = pMap.Layer(0) Affectation d’un pointeur : utiliser le mot-clé Set : Set pMap.FeatureSelection = pSelection 43 HB – Programmation d’ArcGIS – Support de cours Exercice 3 Interprétation d'un modèle objet. Ecriture de code à partir de ce modèle modèle. 44 HB – Programmation d’ArcGIS – Support de cours 22 Points d’entrée dans le modèle objet d’ArcGIS Deux variables globales sont prédéfinies : Application (pointe sur l’interface IApplication de l’objet Application) ThisDocument (pointe sur l’interface IDocument de l’objet MxDocument) ArcMap Application Document ArcMap OMD: ArcMap, ArcMapUI ThisDocument Application.Caption = "Mon application" MsgBox ThisDocument.Title 45 HB – Programmation d’ArcGIS – Support de cours Explorateur d’objet ESRI Utilitaire qui n’est plus livré avec la version 10 ! Plusieurs librairies à référencer (menu Files > Object Libraries reference : fichiers esri*.olb dans \ArcGIS\com Recherche avancée Affichage type diagramme ou syntaxe VB Infobulles Visualisation rapide des interfaces héritées Lien vers l’aide complète (clic droit). 46 HB – Programmation d’ArcGIS – Support de cours 23 Exemple : Lire des informations sur une couche Propriété SelectedLayer de l’objet MxDocument Dim Set Dim Set pMxDoc pMxDoc pLayer pLayer As IMxDocument = ThisDocument As ILayer = pMxDoc.SelectedLayer Document ArcMap Tester si aucune couche n’est sélectionnée : mot-clé Nothing (If pLayer Is Nothing Then…) Couches de l’objet Map (bloc de données) courant Dim Set Dim Set Dim Set pMxDoc As IMxDocument pMxDoc = ThisDocument pMap As IMap pMap = pMxDoc.FocusMap pLayer As ILayer pLayer = pMap.Layer(0) * Bloc de données * Tester le type de la couche sélectionnée : mot-clé mot clé TypeOf (If TypeOf pLayer Is IFeatureLayer Then…) Function FindLayerByName (pMap as IMap, sName as String) as ILayer Dim i as Integer For i = 0 to pMap.LayerCount -1 If pMap.Layer(i).Name = sName Then Set FindLayerByName = pMap.Layer(i) End If Next End Function 47 HB – Programmation d’ArcGIS – Support de cours Exercice 4 Apprentissage des diagrammes ArcObjects. Navigation et interprétation du modèle objet objet. Ecriture de code à partir du modèle et de la variable Application. Travail avec les blocs de données du document. Test du type de couche sélectionnée. 48 HB – Programmation d’ArcGIS – Support de cours 24 5. Les sources de données (accès, création) HB – Programmation d’ArcGIS – Support de cours Sommaire Accès aux données Accès aux blocs de données et aux couches Collections et énumérations Ajout d’une couche à un bloc de données Objets permettant de créer des données Création d’un espace de travail (Workspace) Accès aux classes d’entités Création de nouveaux jeux de données (tables, classes d’entités…) Champs et collections de champs Ajout d’enregistrements Mise à jour de valeurs 50 HB – Programmation d’ArcGIS – Support de cours 25 Accès aux blocs de données bloc actif (par IMxDocument) Dim Set Dim Set pMxDoc As IMxDocument pMxDoc = ThisDocument pMap As IMap pMap = pMxDoc.FocusMap tous les blocs (par IMxDocument) : collection Dim pMaps As IMaps Set pMaps = pMxDoc.Maps IMaps Accès aux couches couche sélectionnée (par IMxDocument) Dim pLayer As ILayer Set pLayer = pMxDoc.SelectedLayer couche particulière (par IMap) Set pLayer = pMap.Layer(i) toutes les couches (par IMap) : énumération Set pEnumLayer = pMap.Layers IEnumLayer 51 HB – Programmation d’ArcGIS – Support de cours Boucler sur les collections et les énumérations Une collection est ordonnée : Eléments référencés par leur position. Index commence à 0. boucle For… For Next avec variable compteur compteur. Dim Dim Set For i As Integer pMaps as IMaps pMaps = pMxDoc.Maps i = 0 to pMaps.Count – 1 MsgBox pMaps.Item(i).Name N t i Next chaînage d’interfaces Une énumération (objet de type IEnumXXX) possède 2 méthodes : Next (renvoyer l’élément suivant). Reset (se replacer en haut de l’énumération = avant le premier élément). boucle Do While ou Do Until… Loop Début Dim pEnumLayer as IEnumLayer Set pEnumLayer = pMap.Layers ‘Se placer sur le premier élément Dim pLayer as ILayer Set pLayer = pEnumLayer.Next pEnumLayer.Reset Do Until pLayer Is Nothing MsgBox pLayer.Name Set pLayer = pEnumLayer.Next Loop Nothing 52 HB – Programmation d’ArcGIS – Support de cours 26 Ajouter une nouvelle couche à un bloc de données Layer est une classe abstraite : propriétés générales de tous les types de couches. ILayer : propriétés Name, Visible, MaximumScale, MinimumScale... IGeoDataset : propriétés Extent, SpatialReference... Classes filles (CoClasses) : RasterLayer, FeatureLayer, CADLayer, TINLayer… ‘Référence du bloc de données en cours Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pMap As IMap Set pMap = pMxDoc.FocusMap ‘Création d’un objet couche vectorielle Dim pFLayer As ILayer Set pFLayer = New FeatureLayer pFLayer.Name = "Toto" ‘Ajout de la couche au bloc de données pMap.AddLayer p p y pFLayer La couche ne contient pas de données, il faut spécifier une source de données (ici la source d'une autre couche): Dim pFClass As IFeatureClass Set pFClass = pAutreCouche.FeatureClass pMap.AddLayer pFLayer 53 HB – Programmation d’ArcGIS – Support de cours Objets permettant d’accéder/créer des données Extraits des diagrammes DataSourcesFile, DataSourcesGDB, Geodatabase WorkspaceFactory IWorkspaceFactory Workspace etc. Types d’espaces de travail (Workspaces) Jeu de données : images, tables, classe d’entité… * Dataset ShapeFileWorkspaceFactory (répertoire) Field AccessWorkspaceFactory 1..* ArcInfoWorkspaceFactory Fields (géodatabase) Classes d’entités (FeatureClass) Jeu de classes d’entités (FeatureDataSet) Row Table FeatureDataSet * 54 FeatureClass HB – Programmation d’ArcGIS – Support de cours 27 Créer un espace de travail (Workspace) AccessWorkspaceFactory IWorkspaceFactory : interface générale pour tous les types de WorkspaceFactory Ses méthodes renvoient un objet Workspace OpenFromFile : accède à un répertoire du disque ou une géodatabase personnelle. Open : connexion à une base de données ArcSDE, liaison ODBC… Dim pWFactory As IWorkspaceFactory Set pWFactory = New AccessWorkspaceFactory Dim pWorkspace As IWorkspace Set pWorkspace = pWFactory.OpenFromFile("C:\Stage\Data\Montpellier.MDB", Application.hWnd) hWnd (window handle) : identifiant unique de la fenêtre appelante ou Set pWorkspace = pWFactory.Open(pParamConnexion, Application.hWnd) Tester l’existence du Workspace (chemin, nom de fichier…) avec la méthode IsWorkspace. De type IPropertySet (collection de couples propriété-valeur), ensemble des paramètres requis pour la connexion : login, mot de passe, nom du serveur… Nothing si inapproprié. 55 HB – Programmation d’ArcGIS – Support de cours Accès aux classes d’entités (FeatureClass) Interface IFeatureWorkspace de la classe Workspace. Directement (méthode OpenFeatureClass) ou à travers un jeu de classes d’entités (méthode OpenFeatureDataset). IWorkspace p Dim Set Dim Set Dim Set pFWorkspace pFWorkspace pFCCommunes pFCCommunes pFDCaptages pFDCaptages As IFeatureWorkspace = pWorkspace 'QI pour IFeatureWorkspace As IFeatureClass = pFWorkspace.OpenFeatureClass("communes") As IFeatureDataset = pFWorkspace.OpenFeatureDataset("Captages") Dim Set Dim Set pFCC As IFeatureClassContainer pFCC = pFDCaptages 'QI pour IFeatureClassContainer pFCPtsCaptage As IFeatureClass pFCPtsCaptage = pFCC.ClassByName("PtsCaptage") IFeatureDataSet Propriétés permettent d’accéder à la classe d’entités de diverses façons 56 HB – Programmation d’ArcGIS – Support de cours 28 Exercice 5 Parcourir les blocs de données et les couches d’un document. Ajouter une couche à un bloc de données. Renseigner sa source de données et d’autres d autres propriétés propriétés. 57 HB – Programmation d’ArcGIS – Support de cours Création de nouveaux jeux de données Méthodes de l’interface IFeatureWorkspace d’un objet Workspace : CreateFeatureClass, CreateFeatureDataset, CreateTable... Type de données créé dépend du type de Workspace utilisé : CreateFeatureClass CreateFeatureDataset ShapeFileWorkspaceFactory ShapeFile (3 fichiers) - CreateTable Fichier DBF AccessWorkspaceFactory Classe d’entités Jeu de classes d’entités Table de géodatabase ArcInfoWorkspaceFactory Classe "arc", "polygon", "point", "node“, “label”… Couverture Table Info CreateTable • Nom • Collection de champs p • ClsID, ExtClsID (UID de classes COM, pour créer une classe d’entité personnalisée) Nothing si inutilisé (car interface attendue). • ConfigKeyWord (pour ArcSDE) "" (chaîne vide si inutilisé, car String attendu). CreateFeatureClass = CreateTable + géométrie (ShapeFieldName, esriFeatureType) Nom du champ de type GeometryDef (géométrie préalablement définie) CreateFeatureDataset = Nom + référence spatiale 58 HB – Programmation d’ArcGIS – Support de cours 29 Champ (Field) et collection de champs (Fields) FeatureClass Tables et classes d’entités sont associés à un objet Fields. Fields : collection de un ou plusieurs Field (indexés). CoClasses (instanciables avec New). Interface de lecture des propriétés (IField ou IFields) T bl Table Interface d’écriture des propriétés (IFieldEdit ou IFieldsEdit) attention aux "s" Création d'une collection et ajout d'un champ Dim pFieldsEdit As IFieldsEdit Set pFieldsEdit = New Fields Dim pField_Name As IFieldEdit Set pField_Name = New Field With pField_Name .Name = "Nom" .Type = esriFieldTypeString .Length = 50 End With pFieldsEdit.AddField pField_Name IFields IFieldsEdit Fields IField IFieldEdit Field 1..* Champ de type OID: compteur donnant un numéro unique à chaque enregistrement, géré en interne par ArcGIS, appelé le plus souvent "ObjectId" ou "FID". Obligatoirement un (et un seul) par collection. Champ de type Geometry : appelé le plus souvent "Shape" 59 HB – Programmation d’ArcGIS – Support de cours Exemple : Création d’une table dBase (*.dbf) ‘Déclaration d’un nouvel espace de travail de type ShapeFile Dim pWSFactory As IWorkspaceFactory Set pWSFactory = New ShapefileWorkspaceFactory ‘Récupération d’un Workspace Dim pWorkspace As Iworkspace Set pWorkspace = pWSFactory.OpenFromFile(“C:\Stage\Data”, \ \ Application.hWnd) ‘CI pour IFeatureWorkspace Dim pFWorkspace As IFeatureWorkspace Set pFWorkspace = pWorkspace ‘Création de la collection de champs Dim pFieldsEdit As IFieldsEdit Set pFieldsEdit = New Fields ‘Création des champs Dim pField_Pays As IFieldEdit Set pField_Pays = New Field ‘Définition des propriétés des champs With pField_Pays .Name = “Pays” Pays .Type = esriFieldTypeString .Length = 50 End With ‘Ajout du champ à la collection pFieldsEdit.AddField pField_Pays ‘Création de la table Dim pTable As ITable Set pTable = pFWorkspace.CreateTable(“MonPays”, pFieldsEdit, Nothing, Nothing, “”) 60 HB – Programmation d’ArcGIS – Support de cours 30 Travailler avec les champs Avec l'interface IFieldsEdit : AddField, ajoute un champ. DeleteAllFields, supprime tous les champs. d index n. n DeleteField (n: Integer) efface le champ d'index Avec l'interface IFields : Fieldcount, renvoie le nombre de champs. FindField (nom: String), renvoie l'index du champ nom s'il existe (sinon -1). Field (n: Integer), renvoie le IField correspondant à l'index n. Avec ITable et IFeatureClass AddField, FindField, DeleteField sont proposées par héritage. Propriété Fields qui renvoie la collection IFields. Afficher tous les champs un à un : Si le champ 'Surface' existe, l'affecter à une variable pSurfaceField : For i = 0 To pFClass.Fields.FieldCount - 1 MsgBox pFClass.Fields.Field(i).Name Next i Dim pSurfaceField As IField intFNum = pFClass.FindField("Surface") If intFNum <> -1 Then Set pSurfaceField = pTable.Fields.Field(intFNum) End If 61 HB – Programmation d’ArcGIS – Support de cours Ajouter des enregistrements et des valeurs à une table Ajout d'un enregistrement (ligne d'une table) : CreateFeature sur IFeatureClass renvoie un objet Feature. CreateRow sur ITable renvoie un objet Row Row. La ligne possède la même propriété Fields que sa table d'origine. La propriété Value (index: Integer) permet d'accéder en lecture/écriture à la valeur d'une cellule. IRow Row Feature Table FeatureClass Méthodes de IRow : Store : enregistre les modifications apportées sur une ligne (y compris création). Delete : supprime une ligne. Dim pRow as IRow Set pRow = pTable.CreateRow 'Création pRow.Value(3) = "Toto" pRow.Value(pTable.FindField("Age"))= 12 pRow.Store 'Enregistrement de la ligne Dim pFeature as IFeature Set pFeature = pFClass.CreateFeature 'Création pFeature.Value(3) = "Encore Toto" Set pFeature.Shape = pPolygon pFeature.Store 'Enregistrement de la ligne 62 HB – Programmation d’ArcGIS – Support de cours 31 Références spatiales et champ Géométrie La propriété GeometryDef du champ qui porte la géométrie d'une classe d'entités doit être définie lors de la création de cette classe. 1. IFields IFieldsEdit Fields 0..1 Dim pSpatialReference as ISpatialReference 'Système inconnu Set pSpatialReference = New UnknownCoordinateSystem IGeometryDef IGeometryDefEdit 'Utiliser un fichier PRJ existant Dim pSRFactory As ISRFactory Set pSRFactory = New SpatialReferenceEnvironment Set pSpatialReference = pSRFactory._ GeometryDef 1. Définir le système de référence 2. Créer l'objet GeometryDef 3. Affecter la géométrie au champ "shape" CreateESRISpatialReferenceFromPRJFile(strPRJfile) 'Utiliser une projection prédéfinie Set pSpatialReference = pSRFactory._ CreateGeographicCoordinateSystem(esriSRGeoCS_WGS1984) C G hi C di S ( iS G CS GS1984) 2. 3. Dim pGeometryDef As IGeometryDefEdit Set pGeometryDef = New GeometryDef With pGeometryDef .GeometryType = esriGeometryPolygon Set .SpatialReference = pSpatialReference End With 63 Dim pShapeField as IFieldEdit Set pShapeField = New Field With pShapeField .Name = "Shape" .Type = esriFieldTypeGeometry Set .GeometryDef = pGeometryDef End With HB – Programmation d’ArcGIS – Support de cours Création d'un nouveau Workspace Méthode Create de IWorkspaceFactory renvoie un objet WorkspaceName et non un Workspace. Les objets Name sont une version 'allégée' de l'objet qu'il représentent et héritent tous une méthode Open (sur IName) question qui permet d'atteindre d atteindre l'objet l objet en question. WorkspaceName Workspace 'Création d'un nouvel objet WorkspaceFactory de type Geodatabase Dim pAccessWSFactory As IWorkspaceFactory Set pAccessWSFactory = New AccessWorkspaceFactory 'Création du WorkspaceName Dim pWorkspaceName As IWorkspaceName Set pWorkspaceName = pAccessWSFactory.Create("C:\Stage\Data", _ "MaGDB", Nothing, Application.hWnd) 'QI pour IName Dim pName As IName Set pName = pWorkspaceName 'Ouverture du Workspace Dim pAccessWorkspace as IWorkspace Set pAccessWorkspace = pName.Open 64 HB – Programmation d’ArcGIS – Support de cours 32 Exercice 6 Création d'une géodatabase personnelle Création d'une collection de champs Définition d’un champ de type Geometry Création d'une nouvelle classe d'entités de géodatabase Ajout d'enregistrements Edition de valeurs 65 HB – Programmation d’ArcGIS – Support de cours Les objets Name Simple référence aux objets qu’ils représentent : jeux de données, tables, espaces de travail… Nombre de propriétés et de méthodes limité. O La méthode IName::Open permet d’instancier l’objet véritable. Utilisés pour parcourir rapidement un espace de travail, comme paramètres lors de conversions de fichiers... Name DataSetName WorkspaceName Un objet Workspace peut renvoyer une énumération de DatasetNames et ainsi accéder rapidement à un jeu de données. etc. RasterDataSetName FeatureDataSetName TableName FeatureClassName (OMD: Geodatabase / Name) 66 HB – Programmation d’ArcGIS – Support de cours 33 Exemple : Ouvrir rapidement une classe d’entités de SHP Public Function OuvrirClasse(strDir As String, strSHPName As String) As IFeatureClass ‘Créer un espace de travail de type fichier de formes Dim pWSFactory As IWorkspaceFactory Set pWSFactory = New ShapefileWorkspaceFactory ‘Récupérer l’espace de travail: répertoire strDir Di pWS Dim WS A As IW IWorkspace k Set pWS = pWSFactory.OpenFromFile(strDir, Application.hWnd) ‘Récupérer la liste des jeux de données de l’espace de travail Dim pEnumDSNames As IEnumDatasetName Set pEnumDSNames = pWS.DatasetNames(esriDTFeatureClass) Dim pFClass As IFeatureClass ‘Parcourir l’énumération à la recherche de strSHPName Dim pDSName As IDatasetName Set pDSName = pEnumDSNames.Next Do Until pDSName Is Nothing If pDSName.Name = strSHPName Then Dim p pName As IName Set pName = pDSName 'QI Set pFClass = pName.Open Exit Do End If Set pDSName = pEnumDSNames.Next Loop Set OuvrirClasse = pFClass ‘Affecter à la fonction la classe d’entités recherchée. End Function 67 HB – Programmation d’ArcGIS – Support de cours Objets pour manipuler les données FeatureDataConverter (OMD: Geodatabase / DataTransfer) Conversions entre les formats fichiers de formes, couvertures et géodatabases. ExportOperation (OMD: GeodatabaseUI) Exportation d’une classe d’entité ou d’une table. Correspond à l’option Données / Exporter des données dans ArcMap. ObjectLoader (OMD: EditorExt / Data converter) Ajoute des données à une classe d’entité ou table existante. 68 HB – Programmation d’ArcGIS – Support de cours 34 Exercice 7 Vous avez récupéré un grand nombre de couvertures ArcInfo que vous souhaitez convertir en géodatabases… Cherchez dans l’aide d’ArcGIS Desktop Help for VBA developers quelque chose qui pourrait vous aider. Testez et analysez votre trouvaille. Essayez de comprendre le code et de le rendre plus lisible. 69 HB – Programmation d’ArcGIS – Support de cours 35 6. Filtres, curseurs et sélections HB – Programmation d’ArcGIS – Support de cours Sommaire Modèle objet simplifié Récupérer la sélection courante d'une table ou d'une couche - SelectionSet S l i S Récupérer un sous-ensemble d'enregistrements - Filtres attributaires - Filtres spatiaux - Curseurs et curseurs d'entités - Curseurs de recherche - Curseurs de mise à jour Afficher un sous-ensemble d'entités d'une couche - Ensemble de définition 72 HB – Programmation d’ArcGIS – Support de cours 36 Modèle objet simplifié SelectionSet Row Cursor Table QueryFilter SpatialFilter Feature FeatureCursor FeatureClass en conjonction avec crée un 73 Extrait du diagramme Geodatabase HB – Programmation d’ArcGIS – Support de cours Récupérer la sélection courante À partir d'une couche vectorielle (FeatureLayer) : propriété SelectionSet de IFeatureSelection Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pFSelection As IFeatureSelection Set pFSelection = pMxDoc.SelectedLayer 'QI Dim pSelectSet As ISelectionSet Set pSelectSet = pFSelection.SelectionSet MsgBox pSelectSet.Count & " entités sélectionnées." À partir d'un bloc de données ((Map) p) : propriété FeatureSelection de IMap renvoie un ISelection IEnumFeature ISelection MapSelection Dim pEnumFeat As IEnumFeature S t pEnumFeat E F t = pMxDoc.FocusMap.FeatureSelection M D F M F t S l ti 'QI Set Dim pFeat As IFeature Set pFeat = pEnumFeat.Next 'Se placer en haut Dim i As Integer Do While Not (pFeat Is Nothing) i = i + 1 Set pFeat = pEnumFeat.Next Loop MsgBox "Il y a " & i & " entités sélectionnées." 74 HB – Programmation d’ArcGIS – Support de cours 37 Filtre attributaire : QueryFilter Requête SQL sur un ou plusieurs attributs d'une table. Rédiger la clause Where. <champ> <opérateur> <valeur> La syntaxe SQL varie suivant la source de données : Géodatabase Fichier de formes Couvertures Caractère quelconque ? _ (underscore) Chaîne quelconque * % indifférent sensible Casse Exemple : sélectionner les entités de pCoucheCommune dont le nom commence par A Dim pQFilter As IQueryFilter Set pQFilter = New QueryFilter pQFilter.WhereClause = "NOM_COM like 'A%'" Dim pFSelection As IFeatureSelection Set pFSelection = pCoucheCommune 'QI pFSelection.SelectFeatures pQFilter, esriSelectionResultNew, False 75 Ne sélectionner qu'un enregistrement V/F HB – Programmation d’ArcGIS – Support de cours Filtre spatial : SpatialFilter Type de QueryFilter (hérite de la propriété ClauseWhere pour ajouter un critère attributaire). Sélectionne des entités selon leurs relations spatiales. Utilisable avec classes d'entités uniquement. Critère de recherche défini par les propriétés Geometry (tous types de Geometry, géométrie de référence pour filtrer les entités), GeometryField (le champ qui contient les entités) et SpatialRel. Exemple : trouver l’entité de pUneCouche qui contient pUnPoint ‘Création d’un nouveau filtre spatial Dim pSFilter As ISpatialFilter Set pSFilter = New SpatialFilter ‘Affectation de ses propriétés Set pSFilter Geometry = pUnPoint pSFilter.Geometry pSFilter.SpatialRel = esriSpatialRelWithin ‘QI pour l’interface IFeatureSelection de pUneCouche Dim pFSelection As IFeatureSelection Set pFSelection = pUneCouche 'QI pFSelection.SelectFeatures pSFilter, esriSelectionResultNew, False IFeatureLayer IFeatureSelection 76 FeatureLayer HB – Programmation d’ArcGIS – Support de cours 38 Curseur (Cursor) et curseur d'entités (FeatureCursor) Sous-ensemble d'enregistrements (Row ou Feature) accessibles un à un, géré comme un seul objet. Invisible pour l'utilisateur (différent d'une sélection). Peut-être défini par un filtre attributaire et/ou spatial. Possède une propriété Fields, identique à celle de la table ou de la classe d'entité d'origine, qui permet d'accéder aux champs et à leur contenu (value). Les méthodes pour travailler sur les lignes ou les entités (Delete, Insert, Next, Update) disponibles ou non selon la méthode qui a créé le curseur (Search, Update ou Insert). Dim pFCursor As IFeatureCursor Set pFCursor = classedentité.méthode(filtre, recyclage) Search Insert Update Un QueryFilter, SpatialFilter ou Nothing (renvoie toute la classe) Utiliser la même adresse mémoire pour chaque élément du curseur O/N 77 HB – Programmation d’ArcGIS – Support de cours Les trois types de curseurs Dim pFeatureCursor As IFeatureCursor Le type est déterminé par la méthode utilisée pour renvoyer le curseur. Curseurs renvoyés par la méthode Search. Analyse en lecture seule d'un ensemble d'enregistrements (calcul de statistiques, comptage d'enregistrements...). Utilisable avec ou sans filtre. Méthode Next disponible. Set pFeatureCursor = pFClass.Search(pQFilter, True) Curseurs renvoyés par la méthode Update Mettre à jour ou supprimer les enregistrements d'une base de données. Utilisable avec ou sans filtre. Méthodes Next, Delete, Update disponibles Set pFeatureCursor = pFClass pFClass.Update(pQFilter, Update(pQFilter False) Curseurs renvoyés par la méthode Insert Ajouter des enregistrements dans une base de données. Pas de filtre. Méthode Insert disponible. Set pFeatureCursor = pFClass.Insert(False) 78 HB – Programmation d’ArcGIS – Support de cours 39 Accéder aux enregistrements d'un curseur Lors de leur création, les curseurs pointent au-dessus du premier enregistrement. NextRow | NextFeature pour pointer sur le premier enregistrement. Puis NextRow | NextFeature pour faire défiler les enregistrements. Nothing g est renvoyé y en fin de curseur. Impossible d'atteindre un enregistrement particulier (position), ni de "remonter" dans le curseur, ni même de revenir au début (pas de "Reset"), il faut pour cela réinitialiser le curseur. Exemple : création d'un curseur Search à partir de l'ensemble des entités sélectionnées de la couche (SelectionSet) (SelectionSet). Les curseurs s’utilisent comme des énumérateurs. 'QI entre IFeatureLayer et IFeatureSelection Dim pFeatSelection As IFeatureSelection Set pFeatSelection = pFLayer 'QI 'Récupération du jeu d'entités sélectionnées Dim pSelectionSet As ISelectionSet Set pSelectionSet = pFeatSelection.SelectionSet 'Création du curseur sur toute la sélection Dim pFCursor As IFeatureCursor pSelectionSet.Search Nothing, False, pFCursor 'Parcours du curseur Dim pFeature As IFeature Set pFeature = pFCursor.NextFeature Do Until pFeature Is Nothing MsgBox "Commune = " & pFeature. _ Value(pFeature.Class.FindField("NOM_COM")) Set pFeature = pFCursor.NextFeature Loop 79 HB – Programmation d’ArcGIS – Support de cours Exemple de curseur de mise à jour Mise à jour d'un champ DensitePop sur l'ensemble d'une classe : 'Définition du curseur de mise à jour Dim pUpdateCursor As IFeatureCursor Set pUpdateCursor = pFClass.Update(Nothing, False) ' Tous les enregistrements 'Mise à jour par le curseur Dim pFeature As IFeature Set pFeature = pUpdateCursor.NextFeature 'Se placer sur le premier Do Until pFeature Is Nothing pFeature.Value(pFClass.FindField("DensitePop")) = _ pFeature.Value(pFClass.FindField("POP_99")) / _ pFeature.Value(pFClass.FindField("SUPERFICIE")) pUpdateCursor.UpdateFeature pFeature 'Valider la mise à jour Set pFeature = pUpdateCursor.NextFeature 'Passage au suivant Loop MsgBox "Les entités ont été mises à jour" 80 HB – Programmation d’ArcGIS – Support de cours 40 Appliquer un ensemble de définition à une couche Sous-ensemble d'entités pour l'affichage et l'analyse (propriétés de la couche, onglet Ensemble de définition). Utiliser la propriété DefinitionExpression de l’interface IFeatureLayerDefinition de la classe FeatureLayer. Public Sub SelectedLayerDef(strSQL As String) Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pFDefine As IFeatureLayerDefinition Set pFDefine = pMxDoc.SelectedLayer 'QI pFDefine.DefinitionExpression = strSQL pMxDoc.ActiveView.Refresh 'Rafraîchit la fenêtre End Sub ILayer IFeatureLayerDefinition 81 FeatureLayer HB – Programmation d’ArcGIS – Support de cours Exercice 8 Afficher un sous-ensemble des entités d'une couche - IFeatureLayerDefinition.DefinitionExpression IFeatureLayerDefinition DefinitionExpression Calculer des statistiques pour un sous-ensemble d'entités - IQueryFilter.WhereClause - FeatureCursors Produire un curseur basé sur un critère attributaire et spatial - SpatialFilter - SelectionSet 82 HB – Programmation d’ArcGIS – Support de cours 41 7. Géométries et géotraitements HB – Programmation d’ArcGIS – Support de cours Sommaire Classes d'objets du modèle Geometry. Geometry Créer de nouvelles géométries par la programmation. Examiner les relations spatiales. Afficher des entités. 84 HB – Programmation d’ArcGIS – Support de cours 42 Type d'entités géométriques Instance(s) de Point, Multipoint, PolyLine ou Polygon servent à représenter une entité (Feature). peut-être simple p ou Entité p multiple (sauf couvertures). Fichiers de forme : uniquement segment de type Line. Segment, Path, Ring : utilisés pour l'analyse, le dessin... Polyligne (PolyLine) Polygone (Polygon) Multiple Multiple Simple Simple Chemin (Path) Boucle (Ring) S Segments t BezierCurve Line Point (x, y) : base de toute géométrie (collection de Points) EllipticArc CircularArc Point 2 points reliés par une courbe (Curve) Multipoint 85 HB – Programmation d’ArcGIS – Support de cours Objets du modèle Geometry Geometry Curve Envelope * Point Multipoint IGeometryCollection Segment * Line CircularArc Path * Ring * Polycurve Polyline Polygon GeometryCollection: ensemble de géométries du même type BezierCurve EllipticArc IGeometryCollection Extrait du diagramme Geometry 86 HB – Programmation d’ArcGIS – Support de cours 43 Points et Multipoints Point est défini par un couple de coordonnées (X, Y). Peut avoir des propriétés M (mesures) et Z (altitude). Multipoint est une collection de points. N'importe N importe quel type de géométrie peut être construit à partir d'une collection de points (interfaces IPointCollection et IGeometryCollection). Point * Multipoint IGeometryCollection IPointCollection Dim pPoint As IPoint Set pPoint = New Point pPoint.X = 12 pPoint.Y = 24 'ou pPoint.PutCoords 12, 24 Dim pMultiPoint As IPointCollection Set pMultiPoint = New MultiPoint pMultipoint.AddPoint pPoint 87 HB – Programmation d’ArcGIS – Support de cours Segments ToPoint Classe abstraite avec 4 classes filles : Line, CircularArc, EllipticArc, BezierCurve. FromPoint Héritent toutes de Curve leurs principales propriétés iété : FromPoint, F P i t ToPoint T P i t ett Length. L th ToPoint Les segments permettent d'obtenir des géométries plus complexes : Path, Ring, PolyLine et Polygon Dim pSegment As ICurve Set pSegment = New Line pSegment.FromPoint = pPointA pSegment.ToPoint = pPointB 'ou pSegment.PutCoords pPointA, p g p , pPointB p FromPoint Curve ICurve Segment Line CircularArc 88 EllipticArc BezierCurve HB – Programmation d’ArcGIS – Support de cours 44 Chemins et polylignes Segment * Path (chemin ou cheminement) : collection de segments connectés. Polyline : collection de paths connectés ou non. ISegmentCollection IPointCollection * Création d'une polyligne constituée de 2 chemins d’un segment 'pPoint1 ... pPoint4 déjà définis Dim pGeometryColl As IGeometryCollection Set pGeometryColl = New Polyline Path IGeometryCollection IPointCollection Polyline pPoint4 pPoint4 Dim pSegmentColl As ISegmentCollection Set pSegmentColl = New Path pPoint2 pPoint2 pPoint3 Dim pLine As ILine Set pLine = New Line pLine.PutCoords pPoint1, pPoint2 pSegmentColl.AddSegment pLine pGeometryColl.AddGeometry pSegmentColl pPoint3 pPoint1 pPoint1 Création d'une polyligne simple Dim pPointColl As IPointCollection Set pPointColl = New Polyline pPointColl.AddPoint pPoint1 pPointColl.AddPoint pPoint2 pPointColl.AddPoint pPoint3 pPointColl.AddPoint pPoint4 Set pSegmentColl = New Path Set pLine = New Line pLine.PutCoords pPoint3, pPoint4 pSegmentColl.AddSegment pLine pGeometryColl.AddGeometry pSegmentColl 89 HB – Programmation d’ArcGIS – Support de cours Anneaux et polygones IGeometryCollection ISegmentCollection IPointCollection Polycurve Ring : boucle ou anneau est un type de Path, fermé. Polygon Polygon : collection de Rings. ISegmentCollection IPointCollection IRing Construction d'un Ring, puis d'un polygone à partir de segments : close 'pSegment1 et pSegment2 déjà créés. Dim pSegmentColl As ISegmentCollection Set pSegmentColl = New Ring pSegmentColl.AddSegment pSegment1 pSegmentColl.AddSegment pSegment2 Ring * pPoint4 pSegment2 pPoint3 pPoint1 pSegment1 pPoint2 'Créer un Ring à partir de la collection Dim pRing As IRing Set pRing = pSegmentColl 'QI pRing.Close Création d'un polygone simple à partir de points : Dim pPointColl As IPointCollection Set pPointColl = New Polygon pPointColl.AddPoint pPoint1 pPointColl.AddPoint pPoint2 pPointColl.AddPoint pPoint3 pPointColl.AddPoint pPoint4 pPointColl.AddPoint pPoint1 'Crée un polygone Dim pPolygon As IGeometryCollection Set pPolygon = New Polygon pPolygon.AddGeometry pRing 90 HB – Programmation d’ArcGIS – Support de cours 45 Lecture de la géométrie d'une entité La propriété EnumVertices de IPointCollection retourne un énumérateur des points de la collection. IEnumVertex permet de lire les propriétés des points (coordonnées (coordonnées, numéro de partie et numéro de sommet). Dim pPointColl As IPointCollection Set pPointColl = pPolygon 'QI (cf exemple précédent !) Dim pEnumVertex As IEnumVertex Set pEnumVertex = pPointColl.EnumVertices Dim pPoint As IPoint, lNumPart As Long, lNumSommet As Long 'se se placer en début d'énumération d énumération (premier sommet) pEnumVertex.Next pPoint, lNumPart, lNumSommet Do Until pPoint Is Nothing '... traitements 'passage au sommet suivant pEnumVertex.Next pPoint, lNumPart, lNumSommet Loop 91 HB – Programmation d’ArcGIS – Support de cours Enveloppes IGeometry Geometry Plus petit rectangle englobant d'une géométrie. Toute géométrie a une enveloppe : Envelope - renvoyée par la propriété Envelope de IGeometry. - nulle pour un objet Point. ymax - un objet Envelope a aussi une propriété Envelope qui renvoie un objet Envelope qui a aussi une propriété Envelope qui ... Zoomer sur une entité : pMxDoc.ActiveView.Extent = pFeature.Shape.Envelope 'ou = pFeature.Extent pMxDoc.ActiveView.Refresh pMxDoc ActiveView Refresh 92 xmin ymin xmax Enveloppe d'un polygone HB – Programmation d’ArcGIS – Support de cours 46 Surfaces, longueurs et centroïdes Longueur (Length) Changement d'interface pour ICurve. Implémentée p p par Segment, g Polycurve, y Envelope... p Dim pCurve As ICurve Set pCurve = pLine 'QI MsgBox pCurve.Length Surface (Area) et centre de gravité (Centroid) Changement d'interface pour IArea. Implémentée par Ring, Polygon, Envelope. Dim p pArea As IArea Set pArea = pPolygon 'QI MsgBox "Surface: " & pArea.Area & vbCrLf & _ " Centroïde : " & pArea.Centroid.X & _ "," & pArea.Centroid.Y Valeurs numériques renvoyées par Area et Length sont dans les unités dans lesquelles les entités sont stockées (souvent en mètres) plus parlant de convertir en kilomètres, hectares ou kilomètres carrés. 93 HB – Programmation d’ArcGIS – Support de cours Interfaces d'opérateurs spatiaux ITopologicalOperator Opérations p courantes sur la g géométrie d'entités ((Buffer, Clip, p Cut...). ) IProximityOperator Mesurer la distance entre 2 géométries. IRelationalOperator Examiner les types de relation entre deux géométries. Interfaces implémentées par la plupart des CoClasses de Geometry. Géométries doivent avoir le même système de référence spatiale. Ne s'appliquent pas à des classes d'entités entières. OMD: Geometry 94 HB – Programmation d’ArcGIS – Support de cours 47 ITopologicalOperator Implémentée par Point, Multipoint, Polyline et Polygon : changement d'interface vers ITopologicalOperator. Méthodes s'appliquent à une seule géométrie. d Buffer ConvexHull (enveloppe convexe) Clip (découpage) Difference Boundary (limites) Géometrie Simple = topologiquement correcte (polygones fermés, segments non dupliqués, etc.) : Tests : IsSimple, IsKnownSimple Vérification et correction d d'une une géométrie : Simplify. Simplify 'Retourner un buffer autour d'une entité Dim intDist As Integer Dim pTopolOp As ITopologicalOperator Set pTopolOp = pFeature.Shape 'QI Dim pPolyBuff As IPolygon Set pPolyBuff = pTopolOp.Buffer(intDist) 95 HB – Programmation d’ArcGIS – Support de cours IProximityOperator Implémentée par Point, Multipoint, Polyline, Polygon et les sous-classes de Segment. Trois méthodes pour renvoyer : point le p plus p proche d'une entité. - Le p - La distance minimale à une entité. pPolyline 'Retourne le point de Polyline le plus proche de InPoint et sa distance. Dim pNearestPoint As IPoint Dim pProxOp As IProximityOperator Set pProxOp = pPolyline 'QI Set pNearestPoint = pProxOp.ReturnNearestPoint(pInPoint, esriNoExtension) Dim dblDistance As Double L'opérateur peut rechercher Set pProxOp = pNearestPoint 'QI le point le plus proche sur un dblDistance = pProxOp.ReturnDistance(pInPoint) prolongement de l'entité 96 HB – Programmation d’ArcGIS – Support de cours 48 IRelationalOperator Implémentée par Point, Multipoint, Polyline, Polygon et Envelope. Méthodes renvoient True ou False selon la nature de la relation entre deux entités. Contains : la géométrie contient l'autre géométrie. Crosses : l'intersection des 2 géométries produit une géométrie de dimension inférieure. Disjoint : les géométries ne sont pas intersectées. Equals : les géométries équivalentes. Overlaps : l'intersection des 2 géométries est de même dimension qu'une d'entre elles. Touches : les limites (Boundary) des géométries sont intersectées. Within : la g géométrie est contenue dans l'autre g géométrie. A B Dim pRelationOp As IRelationalOperator Set pRelationOp = pPolygonA Dim fOverlaps As Boolean fOverlaps = pRelationOp.Overlaps(pPolygonB) 97 HB – Programmation d’ArcGIS – Support de cours ITransform2D Implémentée par de nombreuses classes : objets de type Geometry, éléments graphiques, cadres... Move : déplacement de dx en X et dy en Y MoveVector : déplacement suivant la direction et la longueur d'un ILine. Rotate : Rotation de centre IPoint et d'angle (radians) RotationAngle. Scale : mise à l'échelle de sx en X et sy en Y, seul IPoint n'est pas déplacé. Transform : transformation définie par ITransformation (géographique, affine, etc.) (OMD: Map Elements) 98 HB – Programmation d’ArcGIS – Support de cours 49 Géotraitements Les méthodes de l'assistant de géotraitement sont proposées par IBasicGeoprocessor. S'appliquent à une classe d'entités entière. Renvoient R i t un objet bj t F Featureclass. t l (OMD Carto Miscellaneous) Clip Dissolve Intersect Merge 99 Union HB – Programmation d’ArcGIS – Support de cours Systèmes de références spatiales Toutes les géométries héritent de la propriété SpatialReference par IGeometry. SpatialReference p p permet d'obtenir toutes les informations de projection. SpatialReference est affectée par référence : si le système de référence spatiale (SRS) de la classe change, il sera modifié pour toutes les entités associées. MsgBox pUnPoint.SpatialReference.Name Créer un système de référence, Importer un fichier PRJ ... ISpatialReference SpatialReference GeographicCoordinateSystem ISpatialReferenceFactory UnknownCoordinateSystem 100 SpatialReferenceEnvironment ProjectedCoordinateSystem HB – Programmation d’ArcGIS – Support de cours 50 Changement de projection La méthode Project, appliquée sur une géométrie de SRS définie de la projeter dans un nouveau système de référence référence. Changement du SR du bloc de données : Public Sub Projeter() Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pSRFactory As ISpatialReferenceFactory S t pSRFactory Set SRF t = N New S SpatialReferenceEnvironment ti lR f E i t Dim pNewProj As ISpatialReference Set pNewProj = _ pSRFactory.CreateProjectedCoordinateSystem(esriSRProjCS_ED1950EuropeLambert) Set pMxDoc.FocusMap.SpatialReference = pNewProj pMxDoc.ActiveView.Refresh End Sub 101 HB – Programmation d’ArcGIS – Support de cours Exercice 9 Créer un polygone à partir de points. Ajouter des entités à une classe. Modifier la topologie des nouvelles entités en fonction d'entités existantes. Calculer la surface et le périmètre. 102 HB – Programmation d’ArcGIS – Support de cours 51 8. Symboles et représentation des couches HB – Programmation d’ArcGIS – Support de cours Sommaire Modèle objet simplifié Display Couleurs et collections de couleurs Symboles ponctuels, linéaires et surfaciques Eléments graphiques Symbologie d'une couche : FeatureRenderer Utilisation des fichiers de couche (*.lyr) 104 HB – Programmation d’ArcGIS – Support de cours 52 Modèle objet simplifié FeatureRenderer ISymbol Symbol SimpleRenderer Affecté à la propriété Symbol d'un élément graphique ou d'un FeatureRenderer. TextSymbol UniqueValueRenderer MarkerSymbol ClassBreaksRenderer FillSymbol ProportionalSymbolRenderer Attribution d’objets de type Symbol aux entités en fonction de valeurs d'attributs. LineSymbol etc. 3DchartSymbol Boîtes de dialogue Color ColorBrowser ColorRamp ColorEditor 5 classes SymbolEditor etc. 4 classes Extraits des diagrammes Display / Symbols and Color et Carto / Rendering 105 Couleurs (objet Color) HB – Programmation d’ArcGIS – Support de cours IColor Color RgbColor HlsColor 5 manières de définir une couleur : RGB : valeur rouge, vert et bleu (0-255). Gray : niveaux de gris (blanc: 0 – noir: 255). CmykColor HsvColor CMYK : cyan, magenta, jaune et noir (0-255). HSV : teinte (0-360°), saturation et valeur (0-100%). GrayColor HLS : teinte (0-360°), luminance et saturation (0-100%). Objet Color sert à affecter la propriété Color d'un objet Symbol Dim pRgbColor As IRgbColor Set pRgbColor = New RgbColor pRgbColor.Red = 255 pRgbColor.Green = 255 pRgbColor.Blue = 0 Set pSymbol.Color = pRgbColor Utilisation de la propriété RGB de IColor et de la fonction standard RGB de Visual Basic : Dim pRgbColor As IRgbColor Set pRgbColor = New RgbColor pRgbColor.RGB = RGB(255, 255, 0) Set pSymbol.Color = pRgbColor Constantes VB intrinsèques : vbBlue, vbBlack, vbRed... (valeurs RGB) 106 HB – Programmation d’ArcGIS – Support de cours 53 Collections de couleurs (objet ColorRamp) 4 types de collections : Random : couleurs aléatoires. Algorithmic : dégradé entre P C l R PresetColorRamp FromColor et ToColor. RandomColorRamp Preset : 13 couleurs prédéfinies. MultiPart : collection de ColorRamp. M lti tC l R MultipartColorRamp AlgorithmicColorRamp Function GetAlgoRamp(aFromCol As IRgbColor, aToCol As IRGbColor,_ intNumCol As Integer) As IEnumColors Dim pAlgoColorRamp As IAlgorithmicColorRamp Set pAlgoColorRamp = New AlgorithmicColorRamp pAlgoColorRamp.Size = intNumCol pAlgoColorRamp.FromColor = aFromCol pAlgoColorRamp.ToColor = aToCol pAlgoColorRamp.Algorithm = esriHSVAlgorithm Dim fIsOk As Boolean pAlgoColorRamp.CreateRamp fIsOk If Not fIsOk Then Exit Function End If Enumérateur en sortie permettra par Set GetAlgoRamp = pAlgoColorRamp.Colors exemple d'affecter des couleurs selon End Function un dégradé à des plages de valeurs. 107 HB – Programmation d’ArcGIS – Support de cours Boîtes de dialogues Color Les CoClasses ColorPalette, ColorSelector et ColorBrowser permettent d’afficher les boîtes de dialogue ’ standard et de récupérer la couleur choisie par l’utilisateur. Public Function GetUserColor() As IColor ‘Créer le sélecteur de couleur Dim pColorSelector As IColorSelector Set pColorselector = New ColorSelector ‘Afficher la boîte de dialogue Dim fChoix As Boolean fChoix = pColorSelector.DoModal(Application.hWnd) ColorSelector ColorPalette ‘Si l’utilisateur clique sur Annuler If Not fChoix Then Exit Function ‘Sinon, renvoie la couleur sélectionnée Set GetUserColor = pColorSelector.Color ColorBrowser End Function OMD: Display (8.x), Framework (9.x) 108 HB – Programmation d’ArcGIS – Support de cours 54 Symboles textuels : TextSymbol Texte simple (ISimpleTextSymbol) ou mise en forme avancée (IFormattedTextSymbol). Héritent de ITextSymbol (propriétés de base). Création d'un symbole texte : (commence par la création d'une police) Dim pFont As IFontDisp Set pFont = New StdFont pFont.Name = "Arial Black" pFont.size = 40 Dim pTextSymbol As ITextSymbol Set pTextSymbol = New TextSymbol pTextSymbol.Font = pFont IFontDisp n'est pas une interface d'ArcObjects : elle fait partie de la librairie stdole (Standard OLE COM Library). 109 HB – Programmation d’ArcGIS – Support de cours Symboles ponctuels : MarkerSymbol Symbol ISymbol 5 types IMarkerSymbol MarkerSymbol SimpleMarkerSymbol Elément de police TrueType CharacterMarkerSymbol ArrowMarkerSymbol Dim pCharMS As ICharacterMarkerSymbol Set pCharMS = New CharacterMarkerSymbol Dim pFont As IFontDisp Set pFont = New StdFont pFont.Name = "ESRI Default Marker" pCharMS.Font = pFont pCharMS.size = 24 pCharMS.CharacterIndex = 34 PictureMarkerSymbol Collection de MarkerSymbol MultilayerMarkerSymbol Définition d'un symbole ponctuel image Dim pPictureMarker As IPictureMarkerSymbol Set pPictureMarker = New PictureMarkerSymbol pPictureMarker.CreateMarkerSymbolFromFile esriPictureBitmap "c:\Stage\toto.bmp" 110 HB – Programmation d’ArcGIS – Support de cours 55 Symboles linéaires : LineSymbol Plusieurs types de lignes : Simple : trait plein, pointillé... Picture : image répétée. k : symbole b l ponctuel t l (IM k S b l) M Marker (IMarkerSymbol) Hash : ligne hachurée. Cartographic : ligne habillée, motif répétitif, extrémités personnalisées... MultiLayer : collection de lignes. Symbol ISymbol LineSymbol ILineSymbol PictureLineSymbol MarkerLineSymbol SimpleLineSymbol HashLineSymbol Créer une ligne pointillée simple : CartographicLineSymbol Dim pSLineSymbol As ILineSymbol Set pSLineSymbol = New LineSymbol pSLineSymbol.Style = esriSLSDot MultiLayerLineSymbol 111 HB – Programmation d’ArcGIS – Support de cours Symboles de remplissage : FillSymbol Nombreuses classes filles : Picture : image répétée. Line : à partir d'un objet LineSymbol. M Marker k : à partir ti d' d'un objet bj t M MarkerSymbol. k S b l Gradient : à partir d'un objet ColorRamp. DotDensity : densité de points (dépend d'un attribut). MultiLayer : collection de FillSymbol. Symbol ISymbol FillSymbol IFillSymbol PictureFillSymbol LineFillSymbol SimpleFillSymbol MarkerFillSymbol GradientFillSymbol MultiLayerFillSymbol Création d'un symbole de remplissage simple : DotDensityFillSymbol Dim pSFillSymbol As IFillSymbol Set pFillSymbol = New FillSymbol pSFillSymbol.Style = esriSFSForwardDiagonal 112 HB – Programmation d’ArcGIS – Support de cours 56 Objets de type Element Eléments de mise en page cartographique. Nombreuses classes filles. IElement Element FrameElement GraphicElement LineElement Eléments dynamiques : FrameElement (mode mise en page) Habillage de la carte : échelle, légende... Blocs de carte ou de table de données. mis à jour automatiquement suivant les modifications de la carte par l'utilisateur. Geometry TextElement BmpPictureElement RectangleElement CircleElement cf. Chapitre « Mise en page » MarkerElement PolygonElement EllipseElement etc. Eléments statiques : GraphicElement Géométriques : point, lignes, polygones... Textes, images. non mis à jour automatiquement. (OMD : Carto / Map Elements) 113 HB – Programmation d’ArcGIS – Support de cours Création d'un élément graphique Elément '1. Instanciation élément Dim pMarkerElement As IMarkerElement Set pMarkerElement = New MarkerElement '2. Instanciation symbole Dim pMarkerSymbol As ISimpleMarkerSymbol Set pMarkerSymbol = New SimpleMarkerSymbol '3. Instanciation couleur Dim pColor As IRgbColor Set pColor = New RgbColor '4. Définition couleur pColor.RGB = RGB(255,0,0) '5. Affectation de la couleur au symbole pMarkerSymbol.Color = pColor '6. Définition du style du symbole pMarkerSymbol.Style = esriSMSDiamond '7. Affecter le symbole à l'élément pMarkerElem.Symbol = pMarkerSymbol Symbole Couleur Définir sa position sur le bloc de données ou la mise en page Propriété IElement::Geometry de la classe Element. Renseignée avec un point, une ligne ou une enveloppe. 114 HB – Programmation d’ArcGIS – Support de cours 57 Ajouter un élément à la carte / mise en page Définir la position Propriété IElement::Geometry de la classe Element. Renseignée avec un point, une ligne ou une enveloppe. Dim pElement As IElement Set pElement = pMarkerElement 'QI Unités Page (Layout) ou unités du bloc de données (Map) Dim pPoint As IPoint Set pPoint = New Point pPoint.PutCoords 45.1, 23.1 pElement.Geometry = pPoint Ajouter à la carte ou à la mise en page ((IGraphicsContainer p implémenté p p par Map p et Layout) y ) Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pGContainer As IGraphicsContainer Set pGraphicsContainer = pMxDoc.FocusMap 'QI pGContainer.AddElement pElement, 0 pMxDoc.ActiveView.Refresh Affichage au-dessus des autres éléments. 115 HB – Programmation d’ArcGIS – Support de cours Symbologie des couches : FeatureRenderer IGeoFeatureLayer FeatureRenderer FeatureLayer SimpleRenderer p IFeatureLayer Mode par défaut ScaleDependantRenderer UniqueValueRenderer ClassBreaksRenderer Collection de Renderers (OMD Display) ProportionalSymbolRenderer 'Mise à jour de la propriété 'R d 'Renderer d de IG IGeoFeatureLayer F t L Set pFLayer.Renderer = pRenderer ChartRenderer 'Rafraîchir la zone d'affichage pMxDoc.ActiveView.Refresh BiUniqueValueRenderer 116 'Rafraîchir la table des matières pMxDoc.UpdateContents HB – Programmation d’ArcGIS – Support de cours 58 SimpleRenderer Toutes les entités représentées avec le même symbole. 'Instanciation d'un renderer simple Di pSRenderer Dim SR d A As ISi ISimpleRenderer l R d Set pSRenderer = New SimpleRenderer 'Instanciation d'un symbole de remplissage Dim pFillSymbol As ISimpleFillSymbol Set pFillSymbol = New SimpleFillSymbol pFillSymbol.Style = esriSFSForwardDiagonal 'Instanciation d'une couleur Dim pColor As IRgbColor Set pColor = New RgbColor pColor.RGB = vbBlue 'Affectation de la couleur au symbole ... pFillSymbol.Color = pColor '...puis p du symbole y au Renderer Set pSRenderer.Symbol = pFillSymbol 'Affectation de l'étiquette du Renderer pSRenderer.Label = "Mon joli symbole" 'Affecter la propriété Renderer de IGeoFeatureLayer Dim pGFLayer As IGeoFeatureLayer Set pGFLayer = pSomeLayer Set pGFLayer.Renderer = pSRenderer 'QI 117 HB – Programmation d’ArcGIS – Support de cours ClassBreaksRenderer Un symbole par plage de valeurs numériques. Propriétés Break(i) : Bornes des classes. Définies de manière arbitraire ou issues d'une classification statistique (objet Classify). Field Fi ld : champ h à partir ti d duquell lles classes l sontt créées. éé BreakCount : nombre de classes à créer. ScaleDependantRenderer Un objet Renderer qui contient des objets Renderer Changement du mode de représentation de la couche en fonction de l'échelle Plus de détails à une grande échelle, moins à une petite. Propriétés Breaks : Passage d' d'un n renderer à un na autre tre (plages d'échelle) d'échelle). Doi Doivent ent être définies dans le même ordre que les Renderers. RendererCount : nombre d'objets de la collection. pSDRend.AddRenderer Renderer(i) : accès à la collection. pZoomInRend pSDRend.AddRenderer pZoomOutRend pSDRend.Break(0) = 1000000 pSDRend.Break(1) = 9000000 Set pFLayer.Renderer = pSDRend 118 HB – Programmation d’ArcGIS – Support de cours 59 UniqueValueRenderer Un symbole par valeur unique. Propriétés Field(i) : champ(s) de la classe d'entité pour lequel les valeurs sont affichées ((i: 0 à 2). ) Value(j) : valeur(s) unique(s). ValueCount : nombre de valeurs uniques affichées par le Renderer (par exemple 22 régions pour les 96 départements français). Dim pUVRenderer As IUniqueValueRenderer Set pUVRenderer = New UniqueValueRenderer Dim pColorEnum As IEnumColors Set pColorEnum = MakeRandomRamp(96) pUVRenderer.FieldCount = 1 pUVRenderer.Field(0) = "NOM" Dim pFClass As IFeatureClass Set pFClass = SomeLayer.FeatureClass Dim pFCursor As IFeatureCursor Set pFCursor = pFClass.Search(Nothing, False) Dim pFeature As IFeature Dim pSym As ISimpleFillSymbol Set pFeature = pFCursor.NextFeature Do Until pFeature Is Nothing Set pSym = New SimpleFillSymbol pSym.Color = pColorEnum.Next pUVRenderer.AddValue pFeature.Value(pFClass.FindField("NOM")), "Départements", pSym Set pFeature = pFCursor.NextFeature Loop Set SomeLayer.Renderer = pUVRenderer 119 HB – Programmation d’ArcGIS – Support de cours Travailler avec les fichiers de couche Les couches sont sauvegardées dans le document ArcMap ou sur disque dans des fichiers de couches (*.lyr). Les fichiers de couches stockent les informations sur la couche (chemin d'accès aux données symbologie, données, symbologie mode d'étiquetage d étiquetage, ensemble de définition définition...)) Accès aux fichiers *.lyr : objet GxLayer Sauvegarde la première couche Public Sub SaveFirstLayer(aPath As String) 'Référence au document Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument 'Créer un nouvel objet GxLayer Dim pGxLayer As IGxLayer Set pGxLayer = New GxLayer 'QI pour récupérer l'interface IGxFile Dim pGxFile As IGxFile Set pGxFile = pGxLayer 'Définition du nom du fichier pGxFile.Path = aPath 'On sauve la première couche du bloc de données actif Set pGxLayer.Layer = pMxDoc.FocusMap.Layer(0) 'Sauvegarde du fichier pGxFile.Save End Sub 120 (OMD Catalog) HB – Programmation d’ArcGIS – Support de cours 60 Exercice 10 Créer un nouveau symbole de remplissage et une couleur. Créer un SimpleRenderer. Représenter les couches d'une carte. Sauvegarder une couche du document. Ajouter des fichiers de couches au bloc de données actif. Utiliser un objet ScaleDependantRenderer. 121 HB – Programmation d’ArcGIS – Support de cours 61 9. Contrôles outils et évènements HB – Programmation d’ArcGIS – Support de cours Sommaire Modèle objet de l’interface utilisateur – les CommandItems ( ) Contrôles Outils (ToolControls) Présentation L'interface IDisplayTransformation Classes Feedback Classes Rubberband Interface IGraphicsContainer Mise à jour de l’affichage Evènements et interfaces évènementielles 124 HB – Programmation d’ArcGIS – Support de cours 62 Modèle objet de l’Interface Utilisateur Document Module ArcId renvoie l’UID (unique identifier) de toutes les commandes d’ArcGIS (CommandItem). Dim pCommandItem As ICommandItem S t pCommandItem C dIt D t _ Set = Thi ThisDocument. CommandBars.Find(ArcId.File_AddData) pCommandItem.Execute CommandBars 1 * 1.. CommandItem * CommandBar Catégorie de la boîte Personnaliser Nom de la commande Command UIControl UIToolControl UIEditBoxControl MacroItem COMCommand UIButtonControl Button UIComboBoxControl Tool ToolControl Extrait du diagramme Framework 125 HB – Programmation d’ArcGIS – Support de cours Présentation des UIToolControls Permettent de gérer de nombreux événements et interactions avec l’utilisateur à la souris ou au clavier. Select Événement ‘outil sélectionné’ KeyUp, KeyDown Codes des touches du clavier MouseUp, MouseDown, MouseMove, DblClick Coordonnées écran du pixel cliqué CursorId Éditeur VB doit être fermé lors de l’utilisation des outils : ouvert = mode conception 'Chargement d'un curseur sur le disque (*.ico ou *.cur) Private Function UIToolControll_CursorID() As Variant Set UIToolControl1_CursorID = LoadPicture("C:\Windows\Cursors\cross.cur") End Function 126 HB – Programmation d’ArcGIS – Support de cours 63 Display Interface IDisplayTransformation Conversion de coordonnées entre unités écran (pixels) et unités cartographiques: ToMapPoint et FromMapPoint. ScreenDisplay TransformCoords : conversion d’un ensemble de coordonnées d é (dans (d un sens ou l’autre). l’ t ) Permet d’utiliser les coordonnées x et y (en pixels) renvoyés par les événements de la souris. Coordonnées d’un clic de souris : pixel (x, y) Sub UIToolControl1_MouseDown(ByVal button As Long, _ ByVal shift As Long, ByVal x As Long, ByVal y As Long) MsgBox "X = " & x & " - Y = " & y End d Sub b Obtention des coordonnées cartographiques du pixel x, y : Dim pMxApp As IMxApplication Set pMxApp = Application ‘QI Dim pPoint As IPoint Set pPoint = pMxApp.Display.DisplayTransformation.ToMapPoint(x,y) MsgBox "Latitude: " & pPoint.Y & " et longitude: " & pPoint.X 127 HB – Programmation d’ArcGIS – Support de cours Classes Feedback Donne à l’utilisateur une représentation de h t en cours d êt graphique. hi changements dans lla ffenêtre MovePolygonFeedback NewCircleFeedback ReshapeFeedback (etc. + 20 autres CoClasses) (OMD Display) Classes filles : méthodes Start, Stop. Instanciées depuis un objet ToolControl. 128 HB – Programmation d’ArcGIS – Support de cours 64 Classes Rubberband Exemple : rectangle de sélection d’entités. Implémentées dans des procédures MoveDown de ToolControl. Renvoient un objet de même type de géométrie. TrackNew dessine une nouvelle forme. TrackExisting déplace ou remodèle une forme existante. Dim pMxApp As IMxApplication Set pMxApp = Application ‘QI Dim pRubberGeo As IRubberBand C é ti d’ Création d’une enveloppe l Dim pGeo As IGeometry Set pRubberGeo = New RubberEnvelope Set pGeo = pRubberGeo.TrackNew(MxApp.Display, Nothing) Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument pMxDoc.FocusMap.SelectByShape pGeo, pMxApp.SelectionEnvironment, False Dim pActiveView As IActiveView Set pActiveView = pMxDoc.FocusMap pActiveView.Refresh 129 d de sélection él ti HB – Programmation d’ArcGIS – Support de cours Interface IGraphicsContainer Implémentée par les classes Map et PageLayout. Gère l’affichage des éléments graphiques : Ajout Aj t / Suppression S i AddElement, AddElements DeleteElement, DeleteAllElements Modification de l’ordre d’affichage SendBackward, SendToBack BringToFront, Bringforward PutElementOrder 'Supprimer pp tous les éléments g graphiques p q Set pMxDoc = ThisDocument pMxDoc.ActiveView.GraphicsContainer.DeleteAllElements pMxDoc.ActiveView.Refresh 'Mettre les éléments sélectionnés en arrière-plan Dim pGCSelect As IGraphicsContainerSelect Set pGCSelect = pGC 'QI pGC.SendToBack pGCSelect.SelectedElements pMxDoc.ActiveView.Refresh 130 HB – Programmation d’ArcGIS – Support de cours 65 Mise à jour de l’affichage IActiveView::Refresh Redessine entièrement la zone d’affichage (pas optimal). IActiveView::PartialRefresh Redessine seulement les ‘phases’ précisées. IScreenDisplay::Invalidate Redessine un rectangle donné (enveloppe). Appelée par Refresh et PartialRefresh IMxDocument::UpdateContents Met à jour la table des matières du document (liste des couches) 131 HB – Programmation d’ArcGIS – Support de cours Exercice 11 Créer un outil pour dessiner des éléments graphiques simples. Transformer un point écran en point carte. Ajouter un nouvel élément graphique sur la zone d'affichage. Changer la couleur d'un symbole en appuyant sur une touche du clavier. Mettre à jour la barre d’état. Créer différents types de RubberBand suivant une touche pressée au clavier. 132 HB – Programmation d’ArcGIS – Support de cours 66 Interfaces standard et évènementielles Standard (inbound interface) Code client appelle propriétés et méthodes de la classe serveur. Sub AjouterCouche(aLayer) Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument pMxDoc.FocusMap.AddLayer aLayer End Sub Evènementielle (outbound interface) La classe fait appel au code client. Function MxDocument_OpenDocument() As Boolean frmSalut.Show vbModal End Function 133 HB – Programmation d’ArcGIS – Support de cours Utilisation des interfaces évènementielles Déclarations de variable : Au niveau du module. En utilisant le mot-clé WithEvents. Sur le nom de l’objet (interface évènementielle par défaut) ou le nom entre parenthèses sur le diagramme si plusieurs interfaces évènementielles sur le même objet. Private WithEvents m_pActiveViewEvents As Map Private WithEvents m_pMapEvents As MapEvents Dans l’aide VB, rechercher Map ou MapEvents plutôt que le nom de l’interface indiquée par le diagramme. 134 HB – Programmation d’ArcGIS – Support de cours 67 Réaction à un évènement Affectation d’une variable déclarée avec WithEvents sur un objet enclenche la « veille » des événements implémentés par cet objet. Généralement affectée à ll’ouverture ouverture du document. ‘Déclaration au niveau du module Private WithEvents m_pActiveViewEvents As Map Private Function MxDocument_OpenDocument() As Boolean Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Set m_pActiveViewEvents = pMxDoc.FocusMap ‘Evénements surveillés. End Function Si l’on veut suivre le bloc de données actif, quel qu’il soit il faudra réaffecter la variable évènement s’il change. Private Sub m_pActiveViewEvents_ItemAdded(ByVal Item As Variant) MsgBox "Ah aaaahh je t'ai vu, tu viens d’ajouter une couche !" End Sub 135 HB – Programmation d’ArcGIS – Support de cours Exercice 12 Déclarer une variable sur une interface évènementielle évènementielle. Affecter une variable pour coder les évènements d'une couche. Affecter l'étendue de la fenêtre graphique selon la visibilité de la couche. Explorer les évènements de la sélection et du catalogue. 136 HB – Programmation d’ArcGIS – Support de cours 68 10. Éléments de mise en page HB – Programmation d’ArcGIS – Support de cours Sommaire Modèle objet simplifié. Eléments cartographiques (FrameElements) (FrameElements). Ajout d’éléments cartographiques à la mise en page. Accéder aux éléments d'un objet StyleGallery. Les objets StyleSelector. Imprimer et exporter une mise en page. 138 HB – Programmation d’ArcGIS – Support de cours 69 Mxdocument Modèle objet simplifié PageLayout Geometry Element * * Map FrameElement GraphicElement MapSurround * MapFrame ScaleBar TableFrame ScaleLine Legend OLEFrame MapTitle MapSurroundFrame Extrait des diagrammes ArcMap UI, Carto / Map and Page Layout, Carto / Map Elements MarkerNorthArrow 139 Etc. LegendFormat Etc. LegendItem HB – Programmation d’ArcGIS – Support de cours Éléments cartographiques (FrameElements) Mis à jour dynamiquement en fonction des changements opérés dans le bloc de données. Conteneurs pour des blocs de données, des éléments d’habillage de carte (MapSurrounds), des objets d’autres applications ou des tables de données. MapSurround MapSurroundFrame 140 HB – Programmation d’ArcGIS – Support de cours 70 Les classes « StyleGallery » MxDocument StyleGallery * EnumStyleGalleryItem StyleGalleryItem énumération StyleGallery donne accès à ll’énumération de tous les Items d’une GalleryClass donnée. Permet d’exploiter les bibliothèques de style livrées avec ArcMap. (OMD Carto Miscellaneous) 141 HB – Programmation d’ArcGIS – Support de cours Utilisation des symboles de la bibliothèque 1. Référencer l’objet StyleGallery Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument Dim pGallery As IStyleGallery Set pGallery = pMxDoc.StyleGallery 2. Récupérer l’énumération des éléments du style. ‘Récupérer la classe flèches Nord de ESRI.style Dim pEnumNorth As IEnumStyleGalleryItem Set pEnumNorth = pGallery.Items _ ("North ( North Arrows", Arrows , "ESRI ESRI.style style", , "Default") Default ) Nom de la classe de style Nom du fichier .style ( "“ pour ‘tous les styles’) Nom de la catégorie de style ( "“ pour ‘toutes les catégories’) Depuis ArcMap : Outil / Styles / Gestionnaire de styles 142 HB – Programmation d’ArcGIS – Support de cours 71 3. Référencer un élément (Item) du style : par son nom ou par son rang. Dim pNorthItem As IStyleGalleryItem Set pNorthItem = pEnumNorth.Next 'Récupérer la flèche nommée "ESRI North 3" Do Until pNorthItem Is Nothing If pNorthItem.Name = "ESRI North 3" Then Exit Do End If Set pNorthItem = pEnumNorth.Next Loop Ou boucle For..Next pour récupérer le nième élément 4. Obtenir le symbole à partir de l’objet StyleGalleryItem Dim pArrow As INorthArrow Set pArrow = pNorthItem.Item 5. Ajouter l’élément à la mise en page 'Associer l'objet MapSurround à l'objet Map Set pArrow.Map = pMxDoc.FocusMap 'Créer un objet MapSurroundFrame Dim pMSFrame As IMapSurroundFrame Set pMSFrame = New MapSurroundFrame 'Placer l'élément (Flèche nord) dans un conteneur Set pMSFrame.MapSurround = pArrow 'Référencer le GraphicsContainer de la mise en page Dim pGContainer As IGraphicsContainer Set pGContainer = pMxDoc.PageLayout 'Ajouter le MapSurroundFrame à la mise en page pGContainer.AddElement pMSFrame, 0 Utiliser la propriété Geometry de l’élément pour indiquer sa position sur la page. 143 HB – Programmation d’ArcGIS – Support de cours Les objets de type StyleSelector Laisser à l’utilisateur le choix des éléments de mise en page. Appel de boîtes de dialogue standard. 'L'utilisateur L utilisateur choisit une flèche Dim pNorthSel As IStyleSelector Set pNorthSel = New NorthArrowSelector Dim fChoix As Boolean fChoix = pNorthSel.DoModal(Application.hWnd) If Not fChoix Then Exit Sub 1 6 2 7 3 8 1. Symbole d'arrière plan d'un bloc de données (remplissage) 4 2. Symbole du contour du bloc de données (linéaire) 3. Symbole textuel (pour les éléments textuels de la mise en page...) 4. Format des éléments de légende 5. Graticule, carroyage ou repère d'index des blocs de données 6. Flèches du nord 7. Barres d'échelle 8. Symboles textuels pour les échelles sous forme de ratio 9. Symbole des ombres portées des blocs de données (remplissage) 9 'Récupération de l’objet sélectionné Dim pNArrow As INorthArrow Set pNArrow = pNorthSel.GetStyle(0) 144 5 (OMD CartoUI) HB – Programmation d’ArcGIS – Support de cours 72 Impression d’une mise en page Application Mode d’impression donné par une instance d’une classe fille de Printer : PostScript (Ps). Windows (Enhanced Metafile). ArcPress (extension ArcGIS). IPrinter Printer EmfPrinter PsPrinter ArcPressPrinter Application Paper Classe Paper : gère les paramètres d'impression (nom de l'imprimante, taille du papier...) et mise en page. Impression vers un fichier ou vers une imprimante. Extrait du diagramme Output 145 HB – Programmation d’ArcGIS – Support de cours Exportation d’une mise en page IExport Export Application ExportVector ExportImage ExportSVG ExportTiff ExportAI ExportPS ExportEMF ExportPDF ExportJpeg ExportGIF ExportBMP E ExportPNG tPNG Nombreux formats images ou vecteurs disponibles : PDF, JPEG, TIFF, PostScript, EMF, etc. Extension ArcPress (outil de rastérisation spécialisé) Extrait du diagramme Output 146 HB – Programmation d’ArcGIS – Support de cours 73 Exercice 13 Rédiger du code qui ajoute un élément à un mise en page p Créer un élément textuel simple Référencer les éléments d'un objet StyleGallery Ajouter une flèche du nord à la mise en page Exporter la mise en page 147 HB – Programmation d’ArcGIS – Support de cours 74 Epilogue De très nombreuses classes d’objets n’ont pas été évoquées (rasters...) toutefois l’approche est toujours identique : observation b i d du modèle dèl objet, bj d des iinterfaces, f propriétés ié é et méthodes é h d et d des relations avec les autres classes. Les versions successives d’ArcGIS développent et modifient le modèle objet. Il a été annoncé que VBA ne sera plus supporté dans la prochaine version d’ArcGIS, pour des raisons plus commerciales que techniques semble-t-il. Python ne le remplace encore qu’incomplètement et nécessite une récriture complète du code existant. Visual Basic pour .Net dont la syntaxe est proche de VBA est une alternative. L’étape suivante est l’utilisation d’un environnement de développement permettant d’exploiter toutes les possibilités offertes par les ArcObjects : extension du modèle, création de DLL... Bonne route ! 149 HB – Programmation d’ArcGIS – Support de cours 75 Annexes HB – Programmation d’ArcGIS – Support de cours 76 Bibliographie et webographie Programmation d'ArcGIS avec les ArcObjects Formations ESRI France, Support de cours (2003). Introduction à la programmation en VBA sur ArcGIS, Nathalie Sillard, Support de cours ENSG (2003), di disponible ibl en dé décembre b 2011 iicii : http://foro.gabrielortiz.com/comparte/repositorio/Rob_Zombie/Cours_vba.pdf htt //f b i l ti / t / it i /R b Z bi /C b df Exploring ArcObjects, vol. 1 et 2 Michael Zeiler, ESRI Press (2001), en PDF sur le CD ArcGIS v. 8x, Digital books and Sample Maps ArcGIS Desktop Developer Guide PDF livré avec version 9.0 et 9.1 Getting To Know ArcObjects - Robert Burke, ESRI Press (2003) ArcGIS Resource Center : http://help.arcgis.com/en/sdk/10.0/vba_desktop/ao_home.html ArcObjectsOnline (8.x), http://arcobjectsonline.esri.com/ et ArcgisDeveloperOnline (9.x), http://arcgisdeveloperonline.esri.com/ existent toujours mais ne sont plus mis à jour) Support ESRI, http://support.esrifrance.fr et http://support.esri.com Getting Started With VBA, AppDev.com, Support de cours, PDF sur le CD ArcGIS v. 8x, VBA Toolkit) 153 HB – Programmation d’ArcGIS – Support de cours 77 DeliriousPowerpointObjectsFactory ISpatialReferenceFactory Pays Couleur IAnimal Aboyer Nothing Fields Aarrghhhhh ! IChien Miauler Exercice IAnimal Manger 155 Dim pMxDoc As IMxDocument Set pMxDoc = ThisDocument HB – Programmation d’ArcGIS – Support de cours 78