1 | ;------------------------------------------------------------ |
---|
2 | ;------------------------------------------------------------ |
---|
3 | ;------------------------------------------------------------ |
---|
4 | ;+ |
---|
5 | ; NAME: |
---|
6 | ; PLT |
---|
7 | ; |
---|
8 | ; PURPOSE: |
---|
9 | ; trace des graphes horizontaux (cartes) |
---|
10 | ; |
---|
11 | ; CATEGORY: |
---|
12 | ; Graphics, trace des graphes horizontaux |
---|
13 | ; |
---|
14 | ; CALLING SEQUENCE: |
---|
15 | ; plt, champ [,min[, max]] |
---|
16 | ; |
---|
17 | ; INPUTS: |
---|
18 | ; champ: le champ dont on veut faire la carte horizontale champ |
---|
19 | ; peut etre de 2 types: |
---|
20 | ; 1) un tableau 2d ou 3d. Si le champ est un tableau 3d on en |
---|
21 | ; extrait un tableau 2d au niveau stipule par l''utilisateur |
---|
22 | ; qui repond a une question. |
---|
23 | ; 2) une structure repondant aux critaire specifies par |
---|
24 | ; litchamp.pro. cf. IDL> xhelp,'litchamp' |
---|
25 | ; |
---|
26 | ; ces ARGUMENTS ne sont pas obligatoires: |
---|
27 | ; |
---|
28 | ; MAX: valeur maximum que l''on veut prendre en compte dans le trace |
---|
29 | ; des contours. Par defaut on prend le max de tab1 (sur les pts mer) |
---|
30 | ; |
---|
31 | ; MIN: valeur minimum que l''on veut prendre en compte dans le trace |
---|
32 | ; des contours. Par defaut on prend le min de tab1 (sur les pts mer) |
---|
33 | ; |
---|
34 | ; KEYWORD PARAMETERS: |
---|
35 | ; |
---|
36 | ; BOITE:vecteur indiquant la zone geographique sur laquelle doit etre |
---|
37 | ; faite la coupe. Si BOITE a : |
---|
38 | ; 1 element : l''extraction est faite sur [lon1, lon2, lat1, lat2, 0.,boite[0]] |
---|
39 | ; 2 elements: l''extraction est faite sur [lon1, lon2, lat1, lat2, boite[0],boite[1]] |
---|
40 | ; 4 elements: l''extraction est faite sur [Boite, 0, max([gdept, gdepw])] |
---|
41 | ; 5 elements: l''extraction est faite sur [Boite[0:3], 0, Boite[4]] |
---|
42 | ; 6 elements: l''extraction est faite sur Boite |
---|
43 | ; |
---|
44 | ; Ou lon1, lon2,lat1,lat2 sont les variables globales |
---|
45 | ; definies lors du dernier domdef! |
---|
46 | ; |
---|
47 | ; CARTE:Permet de dessiner les continents definits ds IDL. CARTE |
---|
48 | ; peut prendre deux formes: |
---|
49 | ; /CARTE: on dessine les continents a la place du mask |
---|
50 | ; CARTE=2 on dessine le contours des continents par |
---|
51 | ; dessus le dessin masque (ceci permet de voir si le masque |
---|
52 | ; correspond bien aux continents reels). |
---|
53 | ; |
---|
54 | ; CB_TITLE: le titre de la colorbar |
---|
55 | ; |
---|
56 | ; CB_SUBTITLE: le soustitre de la colorbar |
---|
57 | ; |
---|
58 | ; CB_CHARSIZE: The character size of the color bar annotations |
---|
59 | ; |
---|
60 | ; CMREF: la longeur en cm sur le papier que doit faire la fleche |
---|
61 | ; de norme normeref. par defaut ajuste au dessin et compris entre |
---|
62 | ; .5 et 1.5 cm |
---|
63 | ; |
---|
64 | ; /CONT_NOFILL: activer pour ne pas remplir les points masques |
---|
65 | ; a la couleur c_cont mais pour les laisser en transparent! Rq |
---|
66 | ; on trace qd meme le contour du mask de la couleur c_cote |
---|
67 | ; |
---|
68 | ; CONTINTERVALLE: lorsque CONTOUR est active, valeur d'un |
---|
69 | ; intervalle entre deux isolignes traces par un trait ds la couleur |
---|
70 | ; c_lab. Il peut ainsi etre different de celui specifie par INTERVALLE |
---|
71 | ; qui, cas ce cas, ne controle que les isolignes coloriees en |
---|
72 | ; couleurs. Si aucun min n''est specifie, on choisit un contour min qui va |
---|
73 | ; bien avec l''intervalle specifie!. Si ce mot cle n''est pas |
---|
74 | ; specifie, on trace 20 isolignes du min au max. |
---|
75 | ; |
---|
76 | ; CONTLABEL: un entier n. lorsque CONTOUR est active, si n |
---|
77 | ; different de 0, choisit le type de label correspondant aux cas n |
---|
78 | ; pour les isolignes tracees par un trait. Pour specifier le type de |
---|
79 | ; label du contour en couleur, utiliser LABEL |
---|
80 | ; |
---|
81 | ; CONTMAX: lorsque CONTOUR est active, valeur maximum que l''on |
---|
82 | ; veut prendre en compte dans le trace des isolignes traces par un |
---|
83 | ; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer) |
---|
84 | ; du tableau passe ds le mot cle CONTOUR. |
---|
85 | ; |
---|
86 | ; CONTMIN: lorsque CONTOUR est active, valeur minimum que l''on |
---|
87 | ; veut prendre en compte dans le trace des isolignes traces par un |
---|
88 | ; trait de couleur c_lab. Par defaut on prend le max (sur les pts mer) |
---|
89 | ; du tableau passe ds le mot cle CONTOUR. |
---|
90 | ; |
---|
91 | ; CONTNLEVEL: lorsque CONTOUR est active, nombre de contours |
---|
92 | ; trace par un trait de couleur c_lab a dessiner (actif si |
---|
93 | ; CONTLABEL=0) par defaut =20. |
---|
94 | ; |
---|
95 | ; CONTOUR: si on veut tracer les contours d'un champ different que celui |
---|
96 | ; que l''on dessin en couleur (par ex E-P en couleur et QSR en |
---|
97 | ; contours). Doit etre un champ repondant aux meme caracteristiques |
---|
98 | ; que l''argument numero 1 de plt |
---|
99 | ; |
---|
100 | ; GRILLE:'U','T','V','W' ou 'F' pour specifer eventuellement la |
---|
101 | ; grille a laquelle est rattache le champ. Rq: il afaut mieux |
---|
102 | ; utiliser ds ce cas une structure comme champ |
---|
103 | ; |
---|
104 | ; INTERVALLE: valeur d''un intervalle entre deux isolignes. Si |
---|
105 | ; aucun min n''est specifie, on choisit un contour min qui va bien |
---|
106 | ; avec l'intervalle specifie!. Si ce mot cle n''est pas specifie, on |
---|
107 | ; trace 20 isolignes du min au max. Rq: Qd CONTOUR est active |
---|
108 | ; INTERVALLE ne specifie que intervalle entre 2 isolignes coloriees en |
---|
109 | ; couleur. Pour specifier l''intervalle entre 2 isolignes traces par un trait |
---|
110 | ; de couleur c_lab utiliser CONTINTERVALLE. |
---|
111 | ; |
---|
112 | ; /INV: inverse le vecteur couleur utilise pour colorier le graphe |
---|
113 | ; (sans toucher au noir, au blanc et a la palette utilisee) |
---|
114 | ; |
---|
115 | ; LABEL: un entier n. si n different de 0, choisit le type de |
---|
116 | ; label correspondant aux cas n. cf label.pro |
---|
117 | ; Rq: Qd CONTOUR est active, ne specifie le type de label que pour les |
---|
118 | ; isolignes coloriees en couleur. Pour celles tracees par un trait de |
---|
119 | ; couleur c_lab utiliser CONTLABEL. |
---|
120 | ; |
---|
121 | ; /LANDSCAPE: oblige la feuille ou le fenetre a l''ecran a etre |
---|
122 | ; en position "allongee". |
---|
123 | ; |
---|
124 | ; LCT: entier designant le numero de la palette de couleur que |
---|
125 | ; l''on veut utiliser pour le plot. |
---|
126 | ; |
---|
127 | ; MAP:Mot cle a actine losque l''on veut faire une projection. |
---|
128 | ; Ce mot cle peut etre de 2 formes: |
---|
129 | ; MAP=[P0lat,P0lon,Rot]. Pour la description de ces 3 valeurs cf. |
---|
130 | ; l''aide en ligne de MAP_SET. |
---|
131 | ; /MAP: dans ce cas map est calcule tout seul et vaut: |
---|
132 | ; map = [0, (lon1+lon2)/2., 0] |
---|
133 | ; Rq: Un bon moyen de choisir sa projection est la valeur du vecteur |
---|
134 | ; MAP est d''utiliser la demo d''IDL5.2: |
---|
135 | ; IDL> demo |
---|
136 | ; Puis choisir earth sciences et mapping. |
---|
137 | ; Rq2: Par defaut c''est une projection cylindrique qui est effectuee |
---|
138 | ; (avec ou sans le mot cle map). Si on veut une autre projection MAP |
---|
139 | ; doit etre active et il faut rajouter le mot cle: /nom_projection. |
---|
140 | ; par ex pour une projection polaire centree sur le pole sud: |
---|
141 | ; IDL> domdef,-180,180,-90,-45 |
---|
142 | ; IDL> plt, tab, /stereo,map=[-90,0,0] |
---|
143 | ; |
---|
144 | ; MAXIN: permet de specifier la valeur maximum que l''on veut |
---|
145 | ; prendre en compte dans le trace des contours a l''aide d''un |
---|
146 | ; mot cle plutot que par l''argument max. Si l''argument et le |
---|
147 | ; mot cle sont specifies en meme temps, c''est la valeur |
---|
148 | ; specifiee par le mot cle qui est retenue. |
---|
149 | ; |
---|
150 | ; MININ: permet de specifier la valeur minimum que l''on veut |
---|
151 | ; prendre en compte dans le trace des contours a l''aide d''un |
---|
152 | ; mot cle plutot que par l''argument min. Si l''argument et le |
---|
153 | ; mot cle sont specifies en meme temps, c''est la valeur |
---|
154 | ; specifiee par le mot cle qui est retenue. |
---|
155 | ; |
---|
156 | ; NLEVEL: nombre de contours a dessiner. par defaut =20. actif si |
---|
157 | ; LABEL=0 ou n'est pas specifie. |
---|
158 | ; |
---|
159 | ; /NOCOLORBAR: activer si on ne veut pas de colorbar |
---|
160 | ; |
---|
161 | ; /NOCONTOUR: activer si on ne veut pas de contour mais juste |
---|
162 | ; les couleurs |
---|
163 | ; |
---|
164 | ; /NOCOULEUR: activer si on veut juste les contours en noir et |
---|
165 | ; blanc sur fond blanc |
---|
166 | ; |
---|
167 | ; /NOERASE: activer pour faire un dessin a l''ecran sans creer |
---|
168 | ; une nouvelle fenetre |
---|
169 | ; |
---|
170 | ; NORMEREF: la norme de la fleche de reference. par defaut on |
---|
171 | ; essaie de faire qqch qui colle pas trop mal! |
---|
172 | ; |
---|
173 | ; /NOTRI: pour forcer a ne pas utiliser de |
---|
174 | ; triangulation. Attention dans ce cas le trace ne marchera que |
---|
175 | ; si la grille est non deformee (cad, chaque pts d''une |
---|
176 | ; longitude donnee a la meme latitude et chaque pts d''une |
---|
177 | ; latitude donnee a la meme longitude) sauf si on utilise le mot |
---|
178 | ; clef CELL_FILL=2. Rq si le champ contient des points a |
---|
179 | ; !values.f_nan alors on fait qd meme une triangulation. |
---|
180 | ; |
---|
181 | ; OVERPLOT: pour faire un plt par dessus un autre. Rq: |
---|
182 | ; contrairemnet a l''utilisation de CONTOUR ou de VECTEUR, |
---|
183 | ; l''utilisation de ce mot clef ne modifie pas la legende ou/et |
---|
184 | ; la barre de couleur. |
---|
185 | ; |
---|
186 | ; PETITDESSIN: vecteur de 3 ou 4 elements, applique pour faire un |
---|
187 | ; dessin sur une petite portion de feuille ou d''ecran. il delimite |
---|
188 | ; la zone ds laquelle va etre fait le dessin |
---|
189 | ; si il a 4 elements: |
---|
190 | ; il est alors constitute des coordonnees -exprime en cm reperes par |
---|
191 | ; rapport au coin en bas a gauche de la feuille ou de la fenetre |
---|
192 | ; (en portrait comme en landscape)- du coin en bas a |
---|
193 | ; gauche et du coin en haut a droite de la zone de dessin. |
---|
194 | ; si il a 3 elements: |
---|
195 | ; Ds ce cas, on divise la fenetre ou l''ecran en PETITDESSIN[0] |
---|
196 | ; colonnes, en PETITDESSIN[1] lignes le dessin se faisant ds la |
---|
197 | ; case numero PETITDESSIN[2].La numerotation commencant en haut |
---|
198 | ; a gauche par le numero 1 et suivant apres dans le sens de |
---|
199 | ; l''ecriture. |
---|
200 | ; Par defaut on fait un dessin occupant la plus grande place possible |
---|
201 | ; tout en concervant le rapport d''aspect (sauf qd REMPLI est active) |
---|
202 | ; |
---|
203 | ; /PORTRAIT: oblige la feuille ou la fenetre a etre en position "debout". |
---|
204 | ; |
---|
205 | ; /POST: faire une sortie postscript. Ne marche que si on fait |
---|
206 | ; un seul dessin sur la feuille. Si on fait plusieurs dessins, |
---|
207 | ; utiliser @ps ou plein2dessins |
---|
208 | ; |
---|
209 | ; /REMPLI:oblige le dessin a occuper l'espace maximum definit |
---|
210 | ; par petitdessin |
---|
211 | ; |
---|
212 | ; /REVERSE_X: pour inverser l''axe des x (et aussi le dessin) |
---|
213 | ; |
---|
214 | ; /REVERSE_Y: pour inverser l''axe des y (et aussi le dessin) |
---|
215 | ; |
---|
216 | ; /STRICTFILL: activer ce mot clef pour que le remplissage des |
---|
217 | ; contours ce fasse precisement entre le min et le max specifie |
---|
218 | ; en laissant en banc les valeurs inferieurs au min specifie et |
---|
219 | ; superieurs au max specifie. |
---|
220 | ; |
---|
221 | ; STYLE: style de tracer a adopter pour dessiner les isolignes par |
---|
222 | ; defaut style=0. cf style.pro |
---|
223 | ; |
---|
224 | ; /TRANS: fait un postscript (active /post automatiquement) et l''imprime |
---|
225 | ; -si on le desire- sur un transparant |
---|
226 | ; |
---|
227 | ; UNLABSUR: entier n. specifant qu''on ne labelle qu''un |
---|
228 | ; contour sur n. Par defaut unlabsur=2 |
---|
229 | ; |
---|
230 | ; /UNSUR2: si on veut tracer un countour sur deux. par defaut trace |
---|
231 | ; tous les contours |
---|
232 | ; |
---|
233 | ; /UNVECTSUR:un scalaire n on un tableau a 2 elements [n1,n2]. |
---|
234 | ; dans le premier cas, on tracera un vecteur sur n suivant les |
---|
235 | ; x et les y. |
---|
236 | ; dans le second cas on tracera un vecteur sur n1 suivant x |
---|
237 | ; et un vecteur sur n2 suivant y |
---|
238 | ; Rq; pour tracer tous les vecteurs suivant y et 1 sur 2 suivant |
---|
239 | ; x mettre unvectsur=[2,1] |
---|
240 | ; Rq: ce mot cle est passe ds _extra |
---|
241 | ; |
---|
242 | ; VECTCOLOR: la couleur de la fleche. Par defaut noir (couleur 0) |
---|
243 | ; |
---|
244 | ; VECTEUR: une structure a 2 elements contenant les 2 champs U |
---|
245 | ; et V des valeurs de la composante zonale et meridienne du |
---|
246 | ; champ de vecteurs a tracer. Ces champs peuvent etre un tableau |
---|
247 | ; ou une structure |
---|
248 | ; par ex: vecteur={matriceu:lec('unsurface'),matricev:lec('vnsurface')} |
---|
249 | ; rq:le nom des elements de vecteur n''a aucune importance. |
---|
250 | ; vecteur={u:lec('unsurface'),v:lec('vnsurface')} convient aussi |
---|
251 | ; |
---|
252 | ; VECTMIN=norme minimum des vecteurs a tracer |
---|
253 | ; |
---|
254 | ; VECTMAX=norme maximum des vecteurs a tracer |
---|
255 | ; |
---|
256 | ; VECTTHICK; l''epaissuer de la fleche. par defaut 1. |
---|
257 | ; |
---|
258 | ; WINDOW: numero de la fenetre ou l'on veut faire le graphe (permet |
---|
259 | ; d'ouvrir plusieurs fenetres). par defaut on ouvre 'IDL0' |
---|
260 | ; |
---|
261 | ; YSURX: rapport d'echelle entre y et x (par ex: =1 pour un repere |
---|
262 | ; orthonorme, =2 si l'axe des y est deux fois plus dilate que celui des x). |
---|
263 | ; Par defaut on adapte pour occupe une grande partie de la feuille en sortie |
---|
264 | ; postScript ou pour cree une fenetre pas trop etiree |
---|
265 | ; |
---|
266 | ; COMMON BLOCKS: |
---|
267 | ; common.pro |
---|
268 | ; |
---|
269 | ; SIDE EFFECTS: |
---|
270 | ; |
---|
271 | ; RESTRICTIONS: |
---|
272 | ; |
---|
273 | ; EXAMPLE: |
---|
274 | ; |
---|
275 | ; MODIFICATION HISTORY: Sebastien Masson (smasson@lodyc.jussieu.fr) |
---|
276 | ; 7/1999 |
---|
277 | ; Sebastien Masson 08/02/2000 checkfield and |
---|
278 | ; notri keyword (or triangule = -1) . |
---|
279 | ;- |
---|
280 | ;------------------------------------------------------------ |
---|
281 | ;------------------------------------------------------------ |
---|
282 | ;------------------------------------------------------------ |
---|
283 | pro plt,tab1, giventype,givenmin,givenmax,CARTE=carte,CONTOUR=contour $ |
---|
284 | ,INTERVALLE=intervalle,INV=inv, GRILLE = grille, BOITE = boite $ |
---|
285 | ,CONTINTERVALLE=contintervalle,LABEL=label,CONTLABEL=contlabel $ |
---|
286 | ,STYLE=style,CONTMAX=contmax,CONTMIN=contmin,NLEVEL=nlevel,CONTNLEVEL=contnlevel $ |
---|
287 | , VECTEUR=vecteur,MAP = map, MININ = minin, MAXIN = maxin $ |
---|
288 | , CONT_NOFILL = cont_nofill, NIVEAUDESSIN = niveaudessin, NOTRI = notri $ |
---|
289 | , DUPLICATE = duplicate, STRICTFILL = strictfill, OVERPLOT = overplot, _extra = ex |
---|
290 | @common |
---|
291 | ;-------------------------------------------------------------- |
---|
292 | tempsun = systime(1) ; pour key_performance |
---|
293 | ;-------------------------------------------------------------- |
---|
294 | ;-------------------------------------------------------------- |
---|
295 | ; I) preparation de l''environnement graphique et petites verifications |
---|
296 | ;-------------------------------------------------------------- |
---|
297 | ;-------------------------------------------------------------- |
---|
298 | ; I1) verification du type de grille associe a tab1 |
---|
299 | ;-------------------------------------------------------------- |
---|
300 | if keyword_set(grille) then vargrid = grille |
---|
301 | if keyword_set(vecteur) AND (NOT keyword_set(grille)) then BEGIN |
---|
302 | vargrid = litchamp(tab1, /grid) |
---|
303 | if vargrid eq '' then BEGIN |
---|
304 | vargrid = xquestion('Quelle est la grille a laquelle le champ a tracer se rapporte?', 'T', /chkwidget) |
---|
305 | vargrid = strupcase(vargrid) |
---|
306 | endif |
---|
307 | ENDIF |
---|
308 | ;-------------------------------------------------------------- |
---|
309 | ; I2) lecture du champ et checkup. |
---|
310 | ;-------------------------------------------------------------- |
---|
311 | if keyword_set(boite) then oldboite = [lon1, lon2, lat1, lat2, prof1, prof2] |
---|
312 | if n_elements(giventype) NE 0 then type = giventype |
---|
313 | if n_elements(givenmin) NE 0 then min = givenmin |
---|
314 | if n_elements(givenmax) NE 0 then max = givenmax |
---|
315 | if n_elements(minin) NE 0 then min = minin |
---|
316 | if n_elements(maxin) NE 0 then max = maxin |
---|
317 | checktypeminmax, 'plt', TYPE = type, MIN = min, MAX = max |
---|
318 | z2d = checkfield(tab1, 'plt', TYPE = type, BOITE = boite, DIREC = direc, VECTEUR = vecteur, _extra = ex) |
---|
319 | if z2d[0] EQ -1 then BEGIN |
---|
320 | if keyword_set(boite) then domdef, oldboite,GRILLE=vargrid |
---|
321 | return |
---|
322 | endif |
---|
323 | ;-------------------------------------------------------------- |
---|
324 | ; I3) reinitialisation. !p.,!x.,!y. |
---|
325 | ; Rq: on ne reinitialise pas qd on rapelle plt en boucle pour utiliser contour |
---|
326 | ;-------------------------------------------------------------- |
---|
327 | if n_elements(contour) ne 4 AND NOT keyword_set(overplot) then reinitplt, /z,/invert |
---|
328 | ;--------------------------------------------------------------- |
---|
329 | ; I4) attribution du mask et des tableaux de longitude et latitude |
---|
330 | ;--------------------------------------------------------------- |
---|
331 | if keyword_set(niveaudessin) then niveau = niveaudessin |
---|
332 | if n_elements(gdept) GE 2 then begin |
---|
333 | IF gdept[0] LT gdept[1] THEN profond = niveau NE 1 ELSE profond = niveau NE jpk |
---|
334 | ENDIF ELSE profond = niveau NE 1 |
---|
335 | if keyword_set(profond) then $ |
---|
336 | ; si on fait un plt en profondeur, il faudra recalculer la |
---|
337 | ; triangulation, ca ne sert donc a rien de calculer tri maintenant |
---|
338 | ; (surtout que c''est assez couteux!) |
---|
339 | grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery $ |
---|
340 | , dernierz, /forplt, _extra = ex ELSE $ |
---|
341 | grille, mask, glam, gphi, gdep, nx, ny,nz,premierx,premiery,premierz,dernierx, derniery $ |
---|
342 | , dernierz, TRI = tri, /forplt, _extra = ex |
---|
343 | if keyword_set(notri) then tri = -1 |
---|
344 | if keyword_set(profond) AND triangles[0] EQ -1 then tri = -1 |
---|
345 | ;---------------------------------------------------------------------------- |
---|
346 | ; I5 determination du mi:min et du ma:max de z2d ainsi que de max: max et |
---|
347 | ; min: min pour le dessin. |
---|
348 | ;----------------------------------------------------------------------------- |
---|
349 | nan = total(finite(z2d,/nan)) < 1 |
---|
350 | ; faudra-t-il faire un autoscale ??? |
---|
351 | autoscale = testvar(var = min) EQ testvar(var = max) AND NOT keyword_set(intervalle) |
---|
352 | determineminmax, z2d, mask, mi, ma, glam, gphi, MININ = min, MAXIN = max, nan = nan,INTERVALLE=intervalle |
---|
353 | if z2d[0] EQ -1 THEN GOTO, sortie |
---|
354 | ; on fait un autoscale si besoin |
---|
355 | if autoscale then autoscale, min, max, intervalle |
---|
356 | ;-------------------------------------------------------------- |
---|
357 | ;-------------------------------------------------------------- |
---|
358 | ; II) mise en place du dessin sur la fenetre ou la page et ouverture |
---|
359 | ; eventuelle de la fenetre et de la page |
---|
360 | ;-------------------------------------------------------------- |
---|
361 | if n_elements(contour) NE 4 AND NOT keyword_set(overplot) THEN $ |
---|
362 | placedessin, 'plt',posfenetre, posbar $ |
---|
363 | , CONTOUR = contour, VECTEUR = vecteur, MAP = map, DIREC = direc, _extra = ex |
---|
364 | ;-------------------------------------------------------------- |
---|
365 | ;-------------------------------------------------------------- |
---|
366 | ; III) habillage du dessin (labels,style,axe) |
---|
367 | ;------------------------------------------------------------ |
---|
368 | ;-------------------------------------------------------------- |
---|
369 | ; |
---|
370 | ;-------------------------------------------------------------- |
---|
371 | ; III1) choix des labels |
---|
372 | ;----------------------------------------------------------- |
---|
373 | if keyword_set(intervalle) AND NOT keyword_set(label) then label=1 |
---|
374 | if keyword_set(label) eq 0 then cas=0 else cas=label |
---|
375 | label,cas,min,max,ncontour,level_z2d,NLEVEL=nlevel,INTERVALLE=intervalle, strictfill = strictfill |
---|
376 | ;-------------------------------------------------------------- |
---|
377 | ; III2)choix de style |
---|
378 | ;----------------------------------------------------------- |
---|
379 | if not keyword_set(style) then style=0 |
---|
380 | style,style,level_z2d,linestyle,thick |
---|
381 | if keyword_set(inv) then couleur=reverse(couleur) |
---|
382 | ;----------------------------------------------------------- |
---|
383 | ; III3) definition des axes |
---|
384 | ;---------------------------------------------------------- |
---|
385 | if NOT keyword_set(overplot) THEN axe, 'xy', _EXTRA = ex |
---|
386 | ; IF NOT(keyword_set(map)) then axe, 'xy' |
---|
387 | ;-------------------------------------------------------------- |
---|
388 | ;-------------------------------------------------------------- |
---|
389 | ;------------------------------------------------------------ |
---|
390 | ; IV) dessin |
---|
391 | ;-------------------------------------------------------------- |
---|
392 | ;-------------------------------------------------------------- |
---|
393 | mask = mask[*, *,niveau-1-premierz] |
---|
394 | if keyword_set(nan) then begin |
---|
395 | notanumber = where(finite(z2d, /nan) EQ 1) |
---|
396 | z2d[notanumber] = max |
---|
397 | masknan = replicate(1, nx, ny) |
---|
398 | masknan[notanumber] = 0 |
---|
399 | ENDIF ELSE masknan = 1 |
---|
400 | z2d = remplit(z2d,nite=(1+(vargrid NE 'T' AND vargrid NE 'W')+keyword_set(nan)) $ |
---|
401 | *(1-keyword_set(cont_nofill)) $ |
---|
402 | , mask = mask*masknan, _extra=ex) |
---|
403 | if NOT keyword_set(strictfill) then z2d = min > z2d < max |
---|
404 | ; |
---|
405 | if vargrid EQ 'T' OR vargrid EQ 'W' then BEGIN |
---|
406 | ; ds ce cas, le masque utilise pour le champ est le meme que celui |
---|
407 | ; utilise pour la terre. |
---|
408 | ; si on fait un dessin en profondeur ou qu''il y a des pts a nan on |
---|
409 | ; redefinit une triangulation sur le zoom |
---|
410 | if keyword_set(profond) OR keyword_set(nan) then BEGIN |
---|
411 | if ( (testvar(var = tri))[0] NE -1 OR keyword_set(nan) ) $ |
---|
412 | AND NOT keyword_set(notri) then BEGIN |
---|
413 | IF keyword_set(cont_nofill) then BEGIN |
---|
414 | if keyword_set(nan) then begin |
---|
415 | tri = triangule(masknan, coinmonte = coinmontemask, coindescend = coindescendmask $ |
---|
416 | , periodique = keyword_set(key_periodique)*(nx EQ jpi)) |
---|
417 | ENDIF ELSE BEGIN |
---|
418 | tri = definetri(nx, ny) |
---|
419 | coinmontemask = -1 |
---|
420 | coindescendmask = -1 |
---|
421 | ENDELSE |
---|
422 | ENDIF ELSE BEGIN |
---|
423 | mask = temporary(masknan*mask) |
---|
424 | tri = triangule(mask, coinmonte = coinmontemask, coindescend = coindescendmask $ |
---|
425 | , periodique = keyword_set(key_periodique)*(nx EQ jpi)) |
---|
426 | ENDELSE |
---|
427 | ENDIF |
---|
428 | indicezoommask = (lindgen(jpi, jpj))[premierx:dernierx, premiery:derniery] |
---|
429 | ENDIF ELSE BEGIN |
---|
430 | if keyword_set(cont_nofill) AND (testvar(var = tri))[0] NE -1 then BEGIN |
---|
431 | tri = definetri(nx, ny) |
---|
432 | coinmontemask = -1 |
---|
433 | coindescendmask = -1 |
---|
434 | endif |
---|
435 | ENDELSE |
---|
436 | glammsk = glam |
---|
437 | gphimsk = gphi |
---|
438 | ENDIF ELSE BEGIN |
---|
439 | ; ds ce cas, le masque utilise pour le champ n''est pas le meme que celui |
---|
440 | ; utilise pour la terre (grille T); |
---|
441 | ; |
---|
442 | ; si on fait un dessin en profondeur on redefinit une triangulation |
---|
443 | ; sur le zoom, cette triangulation sera utilisee pour tracer le |
---|
444 | ; champ. on utilise tmask pour que les trous de cette triangulation |
---|
445 | ; soient bien les memes que ceux utilises pour tracer le |
---|
446 | ; masque et correspondent bien au trous qu''il y a a cette nouvelle |
---|
447 | ; profondeur. |
---|
448 | if keyword_set(profond) AND (testvar(var = tri))[0] NE -1 then BEGIN |
---|
449 | if keyword_set(cont_nofill) then BEGIN |
---|
450 | tri = definetri(nx, ny) |
---|
451 | coinmontemask = -1 |
---|
452 | coindescendmask = -1 |
---|
453 | ENDIF ELSE $ |
---|
454 | tri = triangule(tmask[premierx:dernierx, premiery:derniery, niveau-1] $ |
---|
455 | , coinmonte = coinmontemask, coindescend = coindescendmask $ |
---|
456 | , periodique = keyword_set(key_periodique)*(nx EQ jpi)) |
---|
457 | ENDIF |
---|
458 | ; si on a des pts a nan, comme la grille du mask est differente de |
---|
459 | ; celui du mask il faudra les tracer a part. on definit donc pour cela |
---|
460 | ; trinan, coinmontenan, coindescendnan, indicezoomnan, xnan et ynan |
---|
461 | ; qui permettront de tracer masknan independemment du mask terre. |
---|
462 | ; Rq: on utilise xnan, ynan au lieu de glam et gphi car pour ces 2 |
---|
463 | ; derniers tableaux calcules par grille on a active /forplt donc leur |
---|
464 | ; valeur sur les points terre est celle de glamt et gphit. |
---|
465 | if keyword_set(nan) AND NOT keyword_set(notri) then BEGIN |
---|
466 | trinan = triangule(1-masknan $ |
---|
467 | , coinmonte = coinmontenan, coindescend = coindescendnan $ |
---|
468 | , periodique = keyword_set(key_periodique)*(nx EQ jpi)) |
---|
469 | indicezoomnan = (lindgen(jpi, jpj))[premierx:dernierx, premiery:derniery] |
---|
470 | grille, rien, xnan, ynan |
---|
471 | undefine, rien |
---|
472 | ENDIF |
---|
473 | ; decoupe terre: pour que le tarce des cotes soient propres on essaye de |
---|
474 | ; prenddre des points en + pour la terre comme ca on ne voit pas le |
---|
475 | ; decalage des grilles. c''est ce que fait decoupeterre. au passage on |
---|
476 | ; redefinit trimsk. |
---|
477 | decoupeterre, mask, glammsk, gphimsk, TRI = trimsk, indicezoom = indicezoommask $ |
---|
478 | , coinmonte = coinmontemask, coindescend = coindescendmask, _EXTRA = ex |
---|
479 | ENDELSE |
---|
480 | ;------------------------------------------------------------ |
---|
481 | ; IV1) choix du type de dessin |
---|
482 | ;------------------------------------------------------------ |
---|
483 | typetrace = 'classique' |
---|
484 | if keyword_set(map) then BEGIN |
---|
485 | ; appelle de mapset qd on veut faire des projections |
---|
486 | IF n_elements(map) NE 3 THEN map = [0, ((lon1+lon2)/2.) MOD 360, 0] |
---|
487 | typetrace = 'projection' |
---|
488 | map_lat = map[0] |
---|
489 | map_lon = map[1] |
---|
490 | map_rot = map[2] |
---|
491 | if chkstru(ex, 'TITLE') then begin |
---|
492 | maptitre = ex.title |
---|
493 | ex.title = '' |
---|
494 | endif |
---|
495 | map_set, map_lat, map_lon, map_rot, _extra = ex, position = posfenetre, /iso $ |
---|
496 | ,limit = [lat1, lon1, lat2, lon2], /noborder |
---|
497 | if n_elements(maptitre) ne 0 then ex.title = maptitre |
---|
498 | if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex) |
---|
499 | if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk,glammsk,gphimsk,_EXTRA=ex) |
---|
500 | if n_elements(trinan) GE 2 then BEGIN |
---|
501 | trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex) |
---|
502 | if trinan[0] EQ -1 then undefine, trinan |
---|
503 | endif |
---|
504 | ENDIF ELSE BEGIN |
---|
505 | ;pour que les axes de coordonees soient pris en compte |
---|
506 | if !x.type EQ 0 AND n_elements(contour) LE 4 then $ |
---|
507 | plot, [0], [0], xstyle = 5, ystyle = 5, title = '', subtitle = '', /noerase |
---|
508 | if keyword_set(key_periodique) then BEGIN |
---|
509 | ; ds ce cas la triangulation est refermee en x et couvre toute la |
---|
510 | ; sphere. il faut dont la couper au niveau ou l''on coupe la sphere |
---|
511 | ; pour faire le dessin |
---|
512 | if n_elements(tri) GE 2 then tri = ciseauxtri(tri, glam, gphi, _EXTRA = ex) |
---|
513 | if n_elements(trimsk) GE 2 then trimsk = ciseauxtri(trimsk, glammsk, gphimsk,_EXTRA=ex) |
---|
514 | if n_elements(trinan) GE 2 then trinan = ciseauxtri(trinan,xnan,ynan,_EXTRA=ex) |
---|
515 | endif |
---|
516 | endelse |
---|
517 | ;------------------------------------------------------------ |
---|
518 | ; IV2) coutours et coloriages |
---|
519 | ;------------------------------------------------------------ |
---|
520 | if keyword_set(duplicate) then BEGIN |
---|
521 | ; pour marina uniquement ATTENTION C'EST TRES MAL CODE |
---|
522 | lon = glam[*, 0] |
---|
523 | decalage = max(lon)-min(lon)+(lon-shift(lon, 1))[n_elements(lon)-1] |
---|
524 | !x.range[1] = !x.range[1]+(duplicate-1)*decalage |
---|
525 | for i = 1,duplicate-1 do BEGIN |
---|
526 | z2d = [z2d, z2d] |
---|
527 | gphi = [gphi, gphi] |
---|
528 | mask = [mask, mask] |
---|
529 | gphimsk = [gphimsk, gphimsk] |
---|
530 | glam = [glam, glam+i*decalage] |
---|
531 | glammsk = [glammsk, glammsk] |
---|
532 | ENDFOR |
---|
533 | endif |
---|
534 | pltbase, z2d,glam,gphi $ |
---|
535 | , mask,glammsk,gphimsk,trichamp=tri,trimsk=trimsk, /forplt $ |
---|
536 | , level_z2d, couleur, contour = contour, carte = carte $ |
---|
537 | , overplot = keyword_set(overplot)+keyword_set(map) $ |
---|
538 | , c_linestyle=linestyle,c_labels=1-(indgen(n_elements(level_z2d)) MOD 2) $ |
---|
539 | , c_thick=thick, cont_nofill = cont_nofill, nan = nan $ |
---|
540 | , coinmontemask = coinmontemask, coindescendmask = coindescendmask $ |
---|
541 | , coinmontenan = coinmontenan, coindescendnan = coindescendnan $ |
---|
542 | , indicezoommask = indicezoommask, indicezoomnan = indicezoomnan $ |
---|
543 | , masknan = masknan, trinan = trinan, xnan = xnan, ynan = ynan, _extra = ex |
---|
544 | ;------------------------------------------------------------ |
---|
545 | ; IV3) rappelle de plt en boucle qd contour est active |
---|
546 | ;------------------------------------------------------------ |
---|
547 | if n_elements(contour) eq 4 then BEGIN ; c''est la 2eme fois que je passe ds pltt |
---|
548 | contour = {mietma:[mi, ma], unit:varunit, inter:intervalle} ; je renvoie le min, le max et l''unite |
---|
549 | return |
---|
550 | endif |
---|
551 | if keyword_set(contour) THEN BEGIN |
---|
552 | pourlegende = [1, 1, 1, 1] |
---|
553 | oldattributs = saveatt() |
---|
554 | oldcouleur = couleur |
---|
555 | plt,contour,contmin,contmax,CONTOUR=pourlegende, /noerase, NOTRI = notri $ |
---|
556 | ,INTERVALLE=contintervalle,LABEL=contlabel,STYLE=style $ |
---|
557 | ,NLEVEL=contnlevel, DUPLICATE = duplicate, STRICTFILL = strictfill, _extra = ex |
---|
558 | restoreatt, oldattributs |
---|
559 | couleur = oldcouleur |
---|
560 | ENDIF |
---|
561 | ;------------------------------------------------------------ |
---|
562 | ;------------------------------------------------------------ |
---|
563 | ; V) petites finitions |
---|
564 | ;------------------------------------------------------------ |
---|
565 | ;------------------------------------------------------------ |
---|
566 | ; |
---|
567 | ;------------------------------------------------------------ |
---|
568 | ; V1) ajout eventuel de vecteurs en surimpression |
---|
569 | ;------------------------------------------------------------ |
---|
570 | if keyword_set(vecteur) then BEGIN |
---|
571 | oldattributs = saveatt() |
---|
572 | ajoutvect,vecteur,vectlegende, _extra = ex |
---|
573 | restoreatt, oldattributs |
---|
574 | ENDIF |
---|
575 | ; |
---|
576 | if keyword_set(overplot) then GOTO, fini |
---|
577 | ;------------------------------------------------------------ |
---|
578 | ; V2) Trace de la ligne de changement de date,l'equateur et |
---|
579 | ; le meridien de greenwich, ... |
---|
580 | ;------------------------------------------------------------ |
---|
581 | if NOT keyword_set(map) then meridienparallele, 'xy' |
---|
582 | ;------------------------------------------------------------ |
---|
583 | ; V3) pour tracer les continents d'IDL |
---|
584 | ;------------------------------------------------------------ |
---|
585 | if keyword_set(carte) then BEGIN |
---|
586 | ; si noease est passe de _extra, on s''assure qu''il est a 1 |
---|
587 | if chkstru(ex, 'NOERASE') then begin |
---|
588 | oldnoerase = ex.noerase |
---|
589 | ex.noerase = 1 |
---|
590 | ENDIF |
---|
591 | if chkstru(ex, 'cont_thick') then mlinethick = ex.cont_thick ELSE mlinethick = 1 |
---|
592 | IF NOT keyword_set(map) THEN $ |
---|
593 | map_set,0,((lon1+lon2)/2.) MOD 360,0, _extra = ex, position = posfenetre $ |
---|
594 | , limit =[lat1, lon1, lat2, lon2], /NOERASE, /noborder, color = 0 |
---|
595 | if carte NE 2 AND NOT keyword_set(cont_nofill) then $ |
---|
596 | map_continents, /fill_continents, color = c_cont, _extra = ex, /noerase |
---|
597 | map_continents, /continents, color = c_cote, MLINETHICK = mlinethick, /noerase, _extra = ex |
---|
598 | if chkstru(ex, 'NOERASE') THEN ex.noerase = oldnoerase |
---|
599 | ENDIF |
---|
600 | ;------------------------------------------------------------ |
---|
601 | ; V4) legendes + affichage de celles-ci |
---|
602 | ;------------------------------------------------------------ |
---|
603 | legende,mi,ma,'xy', CONTOUR = pourlegende, VECTLEGENDE = vectlegende, INTERVALLE = intervalle, DIREC = direc, _EXTRA = ex |
---|
604 | if n_elements(ex) NE 0 then BEGIN |
---|
605 | ; pour garder les axes du cadre en noir |
---|
606 | if (where(tag_names(ex) EQ 'COLOR'))[0] NE -1 then ex.COLOR = c_cote |
---|
607 | endif |
---|
608 | ; |
---|
609 | case typetrace of |
---|
610 | 'classique': $ |
---|
611 | plot, [0], [0],/noerase,color=0,xtickformat='lonaxe',ytickformat='lataxe' $ |
---|
612 | , xstyle = 1, ystyle = 1, _extra = ex |
---|
613 | 'projection': BEGIN |
---|
614 | if chkstru(ex, 'NOERASE') then begin |
---|
615 | oldnoerase = ex.noerase |
---|
616 | ex.noerase = 1 |
---|
617 | endif |
---|
618 | if chkstru(ex, 'SUBTITLE') then !p.subtitle = ex.SUBTITLE |
---|
619 | if n_elements(maptitre) ne 0 then ex.title = maptitre |
---|
620 | map_set, map_lat, map_lon, map_rot, _extra = ex, /iso, limit = [lat1, lon1, lat2, lon2]$ |
---|
621 | , /NOERASE, /noborder, title = !p.title, color = 0 |
---|
622 | ; map_proj_info, numproj, /current |
---|
623 | ; map_proj_info, numproj, name = nomproj |
---|
624 | ; if nomproj EQ 'Mercator' OR nomproj EQ 'Cylindrical' OR nomproj EQ 'LambertConic'$ |
---|
625 | ; OR nomproj EQ 'Gnomic' OR nomproj EQ 'AlbersEqualAreaConic' $ |
---|
626 | ; OR nomproj EQ 'TransverseMercator' OR nomproj EQ 'MillerCylindrical' $ |
---|
627 | ; OR nomproj EQ 'LambertConicEllipsoid' then map_grid, box_axes=1,latdel=10,londel=10 $ |
---|
628 | ; ELSE map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30 |
---|
629 | map_grid, charsize = 0.75, /label,latalign = 1,lonalign = 1,latdel = 10,londel = 30, color = 0, _extra = ex |
---|
630 | if chkstru(ex, 'NOERASE') THEN ex.noerase = oldnoerase |
---|
631 | end |
---|
632 | endcase |
---|
633 | ;------------------------------------------------------------ |
---|
634 | ; V5) barre de couleur |
---|
635 | ;------------------------------------------------------------ |
---|
636 | couleur = couleur[0:ncontour-1-keyword_set(strictfill)] |
---|
637 | barrecouleur, position=posbar,divisions=(ncontour-keyword_set(strictfill))/2,min=min $ |
---|
638 | , max=max,discret=couleur,_extra = ex |
---|
639 | ;------------------------------------------------------------ |
---|
640 | ;------------------------------------------------------------ |
---|
641 | ; VI) impression eventuelle |
---|
642 | ;------------------------------------------------------------ |
---|
643 | ;------------------------------------------------------------ |
---|
644 | fini: |
---|
645 | terminedessin, _extra = ex |
---|
646 | if keyword_set(vecteur) then grillechoice = [vargrid, 'T', 'U', 'V'] ELSE grillechoice = ['T', vargrid] |
---|
647 | if keyword_set(oldboite) then domdef, oldboite, GRILLE = grillechoice |
---|
648 | ;------------------------------------------------------------ |
---|
649 | ;------------------------------------------------------------ |
---|
650 | sortie: |
---|
651 | if keyword_set(key_performance) NE 0 THEN print, 'temps plt', systime(1)-tempsun |
---|
652 | ;------------------------------------------------------------ |
---|
653 | ;------------------------------------------------------------ |
---|
654 | return |
---|
655 | end |
---|
656 | |
---|
657 | |
---|