Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| main:logiciels:mapinfo:documents:fmb [2009/05/21 17:59] – Robin | main:logiciels:mapinfo:documents:fmb [2026/01/03 20:48] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== La fenêtre MapBasic et l' | ====== La fenêtre MapBasic et l' | ||
| - | |||
| - | * **[[http:// | ||
| ===== 1 : La fenêtre MapBasic ===== | ===== 1 : La fenêtre MapBasic ===== | ||
| Ligne 14: | Ligne 12: | ||
| ==== 1.1 : La fonction affichage de la FMB ==== | ==== 1.1 : La fonction affichage de la FMB ==== | ||
| - | La mission initiale de la FMB est d’afficher les équivalents en MapBasic des commandes passées par le menu, mais avec certaines limitations et variations. Ainsi, | + | La mission initiale de la FMB est d’afficher les équivalents en MapBasic des commandes passées par le menu, mais avec certaines limitations et variations. Ainsi, |
| commandes sont « transcrites » | commandes sont « transcrites » | ||
| - | |||
| - | (CODE) | ||
| Connaître quelles sont les commandes qui sont ainsi affichées va permettre de savoir celles qui pourront être réutilisées par la suite. Une fois la FMB ouverte, l’affichage se fait de façon continue, même si la fenêtre est miniaturisée. La seule façon de l’interrompre est de fermer la fenêtre, ce qui la vide par la même occasion de tout son contenu. | Connaître quelles sont les commandes qui sont ainsi affichées va permettre de savoir celles qui pourront être réutilisées par la suite. Une fois la FMB ouverte, l’affichage se fait de façon continue, même si la fenêtre est miniaturisée. La seule façon de l’interrompre est de fermer la fenêtre, ce qui la vide par la même occasion de tout son contenu. | ||
| Ligne 120: | Ligne 116: | ||
| alter object o geography 7, | alter object o geography 7, | ||
| update selection set obj = o | update selection set obj = o | ||
| + | |||
| + | ==== 3.2 : Utilisations immédiates ==== | ||
| + | |||
| + | La FMB peut se révéler un outil de choix dans certaines utilisations immédiates, | ||
| + | * identifier clairement les conditions pré-requises à l’opération. Par exemple : quelles sont la(es) table(s) ouverte(s) nécessaire(s), | ||
| + | * dégager de la masse d’information enregistrée par la FMB les énoncés essentiels repérer les quelques énoncés qui forment l’essentiel de la procédure, les isoler pour | ||
| + | en former un bloc plus facilement manipulable. | ||
| + | * rechercher s’il y a des éléments variables. les énoncés peuvent contenir des éléments propres à la dernière opération qu’il faudra modifier pour leur réutilisation, | ||
| + | * penser à remplacer des éléments répétés par une ou des variables dans le cas où la procédure comporte plusieurs énoncés faisant appel à un élément commun et qu’elle doit être répétée plusieurs fois, il est souvent plus efficace de remplacer cet élément par une variable; il n’y aura qu’à changer la définition de la variable une fois plutôt que de faire des remplacements multiples à chaque répétition. | ||
| + | * envisager d’écrire certains énoncés pour créer les conditions préalables nécessaires ces énoncés ne sont pas nécessairement partie de ceux enregistrés par la FMB | ||
| + | mais peuvent être essentiels à la procédure | ||
| + | * identifier les parties uniques (énoncés initiaux) et répétitives (procédure même) les énoncés initiaux sont souvent exécutés une seule fois alors que ceux formant le | ||
| + | cœur de la procédure peuvent être exécutés plusieurs fois. Bien les séparer facilitera la tâche de sélectionner des blocs pour leur soumission. | ||
| + | |||
| + | ==== 3.3 : Utilisations différées ==== | ||
| + | |||
| + | Il s’agit d’enregistrer des procédures qui pourraient être reprises dans le futur. Pour cela il s’agit d’enregistrer, | ||
| + | |||
| + | === 3.3.1 : Enregistrement === | ||
| + | |||
| + | La FMB permet d’enregistrer tout son contenu dans un fichier TXT. Si d’autres énoncés non essentiels à la procédure sont dans la fenêtre, il faudra donc éditer ce fichier pour éliminer l’inutile. Si on veut seulement une partie du contenu de la FMB, il suffit d’ouvrir un fichier texte et de faire un simple Copier/ | ||
| + | |||
| + | === 3.3.2 : Conservation === | ||
| + | |||
| + | Conservation veut aussi dire organisation et documentation. Comme la réutilisation est prévue pour le futur, il est plus qu’indispensable de rajouter aux énoncés MB quelques lignes expliquant leur fonction, les conditions d’utilisation, | ||
| + | |||
| + | === 3.3.3 : Réutilisation === | ||
| + | |||
| + | La FMB ne permet que de faire un Copier/ | ||
| + | |||
| + | === 3.3.4 : Document WOR === | ||
| + | |||
| + | Un WOR se distingue d’un fichier TXT sous 2 aspects structurels et un de syntaxe. Un WOR est essentiel un TXT avec une extension différente et un entête (les premières lignes de texte spécifique). On peut donc créer un WOR à partir d’un TXT dans un simple éditeur de texte; il suffit de rajouter au début les lignes voulues et de l’enregistrer avec la bonne extension. | ||
| + | |||
| + | L’en-tête est le suivant : | ||
| + | !Workspace | ||
| + | !Version 600 | ||
| + | !Charset WindowsLatin1 | ||
| + | |||
| + | Le numéro de version devrait être celui correspondant à la version du MI utilisé. Il pourrait toujours être inférieur à cela mais la présence de certains énoncés peut être | ||
| + | incompatible avec ce numéro, quoique cela n’empêchera pas son exécution. Ce n’est que s’il lui est supérieur que MI refusera d’exécuter le WOR. | ||
| + | |||
| + | L’aspect de la syntaxe qui soit différent est que des commentaires peuvent se trouver dans le corps de la procédure sans avoir d’effet sur le déroulement des opérations. | ||
| + | Si nous avons choisi d’avoir un WOR c’est que nous allons le réutiliser de façon différente; | ||
| + | |||
| + | Comme WOR et FMB appartiennent au même univers, ils peuvent communiquer sans difficulté. Ceci veut dire que les variables définies dans l’un sont disponibles dans l’autre. Ceci peut être un avantage mais offrir aussi quelques inconvénients. | ||
| + | |||
| + | Voici un WOR : | ||
| + | !Workspace | ||
| + | !Version 600 | ||
| + | !Charset WindowsLatin1 | ||
| + | dim b as string | ||
| + | print a | ||
| + | b=right$(a, | ||
| + | |||
| + | Dans la FMB : | ||
| + | dim a as string | ||
| + | a=" | ||
| + | run application " | ||
| + | print b | ||
| + | |||
| + | > "Test 1" est imprimé par le WOR et "t 1Tes" par la FMB | ||
| + | |||
| + | === 3.3.5 : TXT ou WOR === | ||
| + | |||
| + | Le choix ne devrait pas être difficile car deux conditions sont bien claires. D’abord, un WOR implique une exécution en bloc de toute la procédure et ne devrait donc pas être choisi si tous les énoncés ne sont pas réutilisés de la même façon. | ||
| + | Ensuite, un WOR ne devrait pas comprendre de variables dont les valeurs doivent être fixées avant exécution; il faudrait alors ouvrir le WOR, faire les corrections, | ||
| + | |||
| + | ===== 4 : Quelques exemples de mise en oeuvre ===== | ||
| + | |||
| + | ==== 4.1 : Construction d’une procédure simple ==== | ||
| + | |||
| + | La table Mont_rue contient les rues définies par des segments limités aux intersections. L’objectif est de créer une carte de rues principales et « complètes » (une seule polyligne par « nom ») | ||
| + | * Ouverture de la carte | ||
| + | Open Table " | ||
| + | |||
| + | * Création d’une carte finale “princip” ne comportant qu’une colonne « nom » | ||
| + | Select nom from mont_rue where rowid=0 into Princip | ||
| + | commit table Princip as " | ||
| + | close table Princip | ||
| + | open table " | ||
| + | * Définition d’une variable objet et d’une variable chaîne | ||
| + | dim obj_nou as object | ||
| + | dim nom_rue as string | ||
| + | * Sélection des segments ayant le nom spécifié « nom_rue » au début de la colonne « nom » | ||
| + | de Mont_rue et fusion en un seul objet | ||
| + | Nom_rue=”Pie ix” | ||
| + | Select nom from mont_rue where nom like nom_rue+”%” into Selrue | ||
| + | Objects Combine Data nom=nom | ||
| + | obj_nou=selection.obj | ||
| + | * Insertion de l’objet et de son nom | ||
| + | insert into Princip (obj,nom) values (obj_nou, nom_rue) | ||
| + | * Visualisation des résultats | ||
| + | browse * from Princip | ||
| + | map from Princip | ||
| + | Set Map Window frontwindow() Zoom Entire | ||
| + | * Une remarque s’impose: la sélection avec « like nom_rue+”%” » risque de ramasser tous les fragments commençant de la bonne façon mais finissant avec des BLD, RUE ou PLA ce qui peut créer des objets bizarres. | ||
| + | |||
| + | ==== 4.2 : Un document WOR succinct ==== | ||
| + | |||
| + | Il s’agit de contrôler la position et la taille de la FMB ainsi que la police d’affichage : | ||
| + | !Workspace | ||
| + | !Version 600 | ||
| + | !Charset WindowsLatin1 | ||
| + | set window 1002 position (.01,3.9) width 8 height 2 font | ||
| + | (" | ||
| + | |||
| + | Ce document pourra être exécuté de la FMB chaque fois voulue. | ||
| + | |||
| + | ==== 4.3 : Un document WOR pour lancement d’un « splash screen » ==== | ||
| + | |||
| + | La table « splash » est le « splash screen » voulu. Une fois affichée avec les paramètres voulus (obtenus de la FMB), la fenêtre carte est maximizée et l’application « splash_timer » est lancée. Cette application « compte » simplement l’écoulement de quelques secondes; comme l’application est active durant ce temps, toute autre opération est gelée, y compris la possibilité de fermer la fenêtre. À la fin du délai, tout est fermé, et MI redevient disponible. | ||
| + | |||
| + | !Workspace | ||
| + | !Version 600 | ||
| + | !Charset WindowsLatin1 | ||
| + | Open Table " | ||
| + | Map From splash | ||
| + | Position (0.0520833, | ||
| + | Width 4.91667 Units " | ||
| + | Set Window FrontWindow() ScrollBars Off Autoscroll On | ||
| + | Set Map | ||
| + | CoordSys Earth Projection 1, 0 | ||
| + | Center (1.690140845, | ||
| + | Zoom 463.1318504 Units " | ||
| + | Preserve Zoom Display Zoom | ||
| + | Distance Units " | ||
| + | Dim WorkspaceMaximizedWindow As Integer | ||
| + | WorkspaceMaximizedWindow = Frontwindow() | ||
| + | Set Window WorkspaceMaximizedWindow Max | ||
| + | Set Map Window WorkspaceMaximizedWindow Preserve Scale | ||
| + | Undim WorkspaceMaximizedWindow | ||
| + | run application " | ||
| + | close all | ||
| + | |||
| + | ==== 4.4 : Transformation d’objets et contrôle de boucle ==== | ||
| + | |||
| + | Transformer des polylignes en lignes simples ayant les mêmes extrémités. Nous utilisons la table ouverte « alines » | ||
| + | Pour un seul objet sélectionné : | ||
| + | update selection set obj= | ||
| + | createline(objectnodex(obj, | ||
| + | objectnodex(obj, | ||
| + | objectnodey(obj, | ||
| + | |||
| + | Si nous voulons appliquer cette formule à tout la table : | ||
| + | update alines set obj= | ||
| + | createline(objectnodex(obj, | ||
| + | objectnodex(obj, | ||
| + | objectnodey(obj, | ||
| + | |||
| + | Il y a un risque de rencontrer l’erreur : « objectnodeX: | ||
| + | objectinfo(obj, | ||
| + | |||
| + | Nous allons d’abord apporter un premier développement : pour avoir un meilleur contrôle sur l’objet même; utilisons une variable objet et une boucle formelle | ||
| + | dim o as object | ||
| + | dim i as integer | ||
| + | i=1 | ||
| + | fetch rec i from alines | ||
| + | o=alines.obj | ||
| + | update alines set obj=createline(objectnodex(o, | ||
| + | objectnodey(o, | ||
| + | objectnodey(o, | ||
| + | i=i+1 | ||
| + | |||
| + | Les problèmes suivants risquent d’apparaître: | ||
| + | * « error fetching record » si une ligne est vide | ||
| + | * « objectnodex argument 1 has invalid type » si un objet n’est pas une polyligne aucune indication de fin de liste sinon parfois une erreur difficile à comprendre. | ||
| + | |||
| + | Modifions la technique pour récupérer les enregistrements et éviter les « vides » | ||
| + | fetch first from alines | ||
| + | o=alines.obj | ||
| + | i=alines.rowid | ||
| + | update alines set obj=createline(objectnodex(o, | ||
| + | objectnodey(o, | ||
| + | objectnodey(o, | ||
| + | fetch next from alines | ||
| + | |||
| + | Toujours l’erreur sur l’argument 3 d’un objet parce qu’il a plusieurs sections et le nombre total des noeuds de la polyligne est appliqué à sa première section. Il nous faut alors changer l’énoncé du problème à «remplacer une polyligne par une ligne simple allant du premier noeud de la première section au dernier noeud de la dernière section » | ||
| + | update alines set obj=createline(objectnodex(o, | ||
| + | objectnodey(o, | ||
| + | objectnodex(o, | ||
| + | objectinfo(o, | ||
| + | objectnodey(o, | ||
| + | objectinfo(o, | ||
| + | |||
| + | Il nous reste toujours un « objectnodex argument 1 has invalid type » potentiel lorsque un des enregistrements n’est pas une polyligne. D’où le besoin de travailler sur des | ||
| + | objets de type homogène et pour cela d’extraire les objets du type voulu et d’agir sur la sélection. | ||
| + | select * from alines where | ||
| + | int(objectinfo(obj, | ||
| + | |||
| + | Finalement, nous voulons maintenir le style propre des lignes car l’énoncé « create line » utilise le même style de ligne courrant pour toutes les nouvelles lignes. La procédure redéfinie se lit dans son ensemble de la façon suivante : | ||
| + | dim o as object | ||
| + | dim i as integer | ||
| + | dim p as pen | ||
| + | select * from alines where | ||
| + | int(objectinfo(obj, | ||
| + | fetch first from sele | ||
| + | o=sele.obj | ||
| + | i=sele.rowid | ||
| + | p=objectinfo(o, | ||
| + | o=createline(objectnodex(o, | ||
| + | objectnodex(o, | ||
| + | objectinfo(o, | ||
| + | objectinfo(o, | ||
| + | alter object o info 2,p | ||
| + | update sele set obj=o where rowid=i | ||
| + | fetch next from sele | ||
| + | |||
| + | Le dernier bloc est répété autant de fois qu’il y a d’enregistrements (bloc est souligné une fois puis répéter < | ||
| + | print sele.rowid | ||
| + | et d’arrêter la procédure dès que l’indicateur ne change plus. | ||
| + | |||
| + | ==== 4.5 : Normalisation de cartes thématiques ==== | ||
| + | |||
| + | Le problème est de produire des cartes thématiques utilisant la même « légende », c’est à dire définies suivant les mêmes règles (nombre de plages, limites des plages, symbolisation). Une table « q_dr_96 » ne contient que des objets et 4 colonnes d’identification dont DR (code numérique, première colonne) et Nom_DR (alpha). | ||
| + | Une table « Q_96dr02 » est un fichier de données statistiques. Sa première colonne est le code numérique de la DR. | ||
| + | Dans ce cas-ci, il s’agit de faire des analyses thématiques de quelques variables dont on veut garder les valeurs de façon permanente. | ||
| + | |||
| + | * 1 - Ajouter les colonnes (nom et type) voulues === | ||
| + | Alter Table " | ||
| + | SeulPls64 Integer) Interactive | ||
| + | |||
| + | * 2 – Transférer les données | ||
| + | Add Column " | ||
| + | Set To V0238 Where COL1 = COL1 | ||
| + | Add Column " | ||
| + | Set To V0242 Where COL1 = COL1 | ||
| + | |||
| + | * 3 – La transformation de structure est permanente (pas de sauvegarde nécessaire) mais le contenu des colonnes doit être enregistré pour devenir permanent. === | ||
| + | Commit Table q_dr_96 Interactive | ||
| + | |||
| + | * 4 – Faire l’analyse thématique du % de personnes de plus de 64 ans vivant seules. | ||
| + | Résultats de la commande : | ||
| + | shade window 49175080 1 with SeulPls64 / TotlPls64 * | ||
| + | 100 ranges apply all use color Brush (2, | ||
| + | 16.2: 22.6 Brush (2, | ||
| + | 22.6: 25.6 Brush (2, | ||
| + | 25.6: 27.3 Brush (2, | ||
| + | 27.3: 29.8 Brush (2, | ||
| + | 29.8: 35.4 Brush (2, | ||
| + | default Brush (2, | ||
| + | # use 1 round 0.1 inflect off | ||
| + | Brush (2, | ||
| + | set legend window 49175080 layer prev display on | ||
| + | shades on symbols off lines off count on | ||
| + | title "% des 64 ans et + vivant seul" | ||
| + | Font(" | ||
| + | Font (" | ||
| + | ranges Font (" | ||
| + | auto display on, auto display on, auto display on, | ||
| + | auto display on ,auto display on | ||
| + | Create Cartographic Legend From Window 49175080 | ||
| + | Behind Frame From Layer 1 | ||
| + | |||
| + | * 5 – Nous voulons la même analyse thématique réalisée sur la paire de tables Q_su_96 (carte) et Q_96su02 (données) ayant exactement les mêmes structures que les précédentes. | ||
| + | Il suffit de changer ‘dr’ en ‘su’ dans les 4 premières commandes. | ||
| + | Alter Table " | ||
| + | SeulPls64 Integer) Interactive | ||
| + | Add Column " | ||
| + | Set To V0238 Where COL1 = COL1 | ||
| + | Add Column " | ||
| + | Set To V0242 Where COL1 = COL1 | ||
| + | Commit Table q_su_96 Interactive | ||
| + | * 6 – Il faut s’assurer que la carte q_su_96 est bien affichée dans la fenêtre active. On va réutiliser les commandes shade, etc, en modifiant seulement l’identificateur de la fenêtre. | ||
| + | dim i_wind as integer | ||
| + | i_wind=frontwindow() | ||
| + | shade window i_wind 1 with SeulPls64 / TotlPls64 * | ||
| + | 100 ranges apply all use color Brush (2, | ||
| + | 16.2: 22.6 Brush (2, | ||
| + | 22.6: 25.6 Brush (2, | ||
| + | 25.6: 27.3 Brush (2, | ||
| + | 27.3: 29.8 Brush (2, | ||
| + | 29.8: 35.4 Brush (2, | ||
| + | default Brush (2, | ||
| + | # use 1 round 0.1 inflect off | ||
| + | Brush (2, | ||
| + | set legend window i_wind layer prev display on | ||
| + | shades on symbols off lines off count on | ||
| + | title "% des 64 ans et + vivant seul" | ||
| + | Font(" | ||
| + | Font (" | ||
| + | ranges Font (" | ||
| + | auto display on, auto display on, auto display on, | ||
| + | auto display on ,auto display on | ||
| + | Create Cartographic Legend From Window i_wind | ||
| + | Behind Frame From Layer 1 | ||
| + | |||
| + | Toutes les modifications voulues peuvent être apportées au Shade en particulier pour ajuster les limites. La réutilisation du Shade est une meilleure alternative aux « gabarits | ||
| + | thématiques » car on conserve ainsi les limites de classe qui étant automatiquement définies par l’ensemble des données dans une analyse thématique « normale » doivent être corrigées à la main chaque fois. | ||
| + | |||
| + | ===== Source ===== | ||
| + | |||
| + | * **[[http:// | ||

