Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
main:logiciels:mapinfo:documents:fmb [2009/05/21 20:10]
Robin
main:logiciels:mapinfo:documents:fmb [2009/07/08 06:59] (Version actuelle)
Robin
Ligne 1: Ligne 1:
 ====== La fenêtre MapBasic et l'​utilisation avancée de MI sans MB ====== ====== La fenêtre MapBasic et l'​utilisation avancée de MI sans MB ======
- 
-  * **[[http://​georezo.net/​jparis/​MI_Enviro/​MBW/​MB_part0_A4.zip|Source]]** 
  
 ===== 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, ​pas toutes les+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, ​seules certaines
 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 254: Ligne 250:
   run application "​c:​mapinfosplash_timer.mbx"​   run application "​c:​mapinfosplash_timer.mbx"​
   close all   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,​1,​1),​ objectnodey(obj,​1,​1),​
 +  objectnodex(obj,​1,​objectinfo(obj,​20)),​
 +  objectnodey(obj,​1,​objectinfo(obj,​20)))
 +
 +Si nous voulons appliquer cette formule à tout la table :
 +  update alines set obj=
 +  createline(objectnodex(obj,​1,​1),​objectnodey(obj,​1,​1),​
 +  objectnodex(obj,​1,​ objectinfo(obj,​20)),​
 +  objectnodey(obj,​1,​objectinfo(obj,​20)))
 +
 +Il y a un risque de rencontrer l’erreur : « objectnodeX:​ argument 3 out of range » qui provient si un des objets est une polyligne à sections multiples; la valeur de
 +objectinfo(obj,​20) de l’argument 3 indique le nombre total de noeuds, alors que l’argument 2 (valeur 1) pointe sur la première section de l’objet; s’il y a plus d’une section, le nombre de noeuds indiqué excède celui de la première section. Il faut donc exercer un contrôle sur les caractéristiques des objets.
 +
 +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,​1,​1),​
 +  objectnodey(o,​1,​1),​objectnodex(o,​1,​objectinfo(o,​20)),​
 +  objectnodey(o,​1,​objectinfo(o,​20))) where rowid=i
 +  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,​1,​1),​
 +  objectnodey(o,​1,​1),​objectnodex(o,​1,​objectinfo(o,​20)),​
 +  objectnodey(o,​1,​objectinfo(o,​20))) where rowid=i
 +  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,​1,​1),​
 +  objectnodey(o,​1,​1),​
 +  objectnodex(o,​objectinfo(o,​21),​objectinfo(o,​21+
 +  objectinfo(o,​21))),​
 +  objectnodey(o,​objectinfo(o,​21),​objectinfo(o,​21+
 +  objectinfo(o,​21)))) where rowid=i
 +
 +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,​1))=4 into sele
 +
 +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,​1))=4 into sele
 +  fetch first from sele
 +  o=sele.obj
 +  i=sele.rowid
 +  p=objectinfo(o,​2)
 +  o=createline(objectnodex(o,​1,​1),​ objectnodey(o,​1,​1),​
 +  objectnodex(o,​objectinfo(o,​21),​objectinfo(o,​21+
 +  objectinfo(o,​21))),​objectnodey(o,​objectinfo(o,​21),​
 +  objectinfo(o,​21+objectinfo(o,​21))))
 +  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 <​ENTRER>,​ clic dans la barre de titre de la FMB). Il n’y a pas d’indication de fin de fichier, la procédure restant bloquée sur le dernier enregistrement. Une possibilité serait d’ajouter avant la dernière ligne un
 +  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 "​q_dr_96"​ ( add TotlPls64 Integer,
 +  SeulPls64 Integer) Interactive
 +
 +  * 2 – Transférer les données
 +  Add Column "​q_dr_96"​ (TotlPls64)From q_96dr02
 +  Set To V0238 Where COL1 = COL1
 +  Add Column "​q_dr_96"​ (SeulPls64)From q_96dr02
 +  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,​255,​16777215)
 +  16.2: 22.6 Brush (2,​13697023,​16777215) Pen (1,2,0),
 +  22.6: 25.6 Brush (2,​10535167,​16777215) Pen (1,2,0),
 +  25.6: 27.3 Brush (2,​7373055,​16777215) Pen (1,2,0),
 +  27.3: 29.8 Brush (2,​3162367,​16777215) Pen (1,2,0),
 +  29.8: 35.4 Brush (2,​255,​16777215) Pen (1,2,0)
 +  default Brush (2,​16777215,​16777215) Pen (1,2,0)
 +  # use 1 round 0.1 inflect off
 +  Brush (2,​16776960,​16777215) at 3 by 0 color 1 #
 +  set legend window 49175080 layer prev display on
 +  shades on symbols off lines off count on
 +  title "% des 64 ans et + vivant seul"
 +  Font("​Arial",​0,​9,​0) subtitle "​recensement 1996"
 +  Font ("​Arial",​0,​8,​0) ascending off
 +  ranges Font ("​Arial",​0,​8,​0) auto display off,
 +  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 "​q_su_96"​ ( add TotlPls64 Integer,
 +  SeulPls64 Integer) Interactive
 +  Add Column "​q_su_96"​ (TotlPls64)From q_96su02
 +  Set To V0238 Where COL1 = COL1
 +  Add Column "​q_su_96"​ (SeulPls64)From q_96su02
 +  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,​255,​16777215)
 +  16.2: 22.6 Brush (2,​13697023,​16777215) Pen (1,2,0),
 +  22.6: 25.6 Brush (2,​10535167,​16777215) Pen (1,2,0),
 +  25.6: 27.3 Brush (2,​7373055,​16777215) Pen (1,2,0),
 +  27.3: 29.8 Brush (2,​3162367,​16777215) Pen (1,2,0),
 +  29.8: 35.4 Brush (2,​255,​16777215) Pen (1,2,0)
 +  default Brush (2,​16777215,​16777215) Pen (1,2,0)
 +  # use 1 round 0.1 inflect off
 +  Brush (2,​16776960,​16777215) at 3 by 0 color 1 #
 +  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("​Arial",​0,​9,​0) subtitle "​recensement 1996"
 +  Font ("​Arial",​0,​8,​0) ascending off
 +  ranges Font ("​Arial",​0,​8,​0) auto display off,
 +  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://​georezo.net/​jparis/​MI_Enviro/​MBW/​MB_part0_A4.zip|Document source]]** //Auteurs : Sebastien Roddier, Jacques Paris//
 
main/logiciels/mapinfo/documents/fmb.1242929408.txt.gz · Dernière modification: 2009/05/21 20:10 par Robin
Recent changes RSS feed Creative Commons License Valid XHTML 1.0 Valid CSS Driven by DokuWiki