IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Superposition de deux fonds de carte


Sujet :

MATLAB

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut Superposition de deux fonds de carte
    bonjour

    j'ai un problème lorsque je superpose deux fonds de carte
    le premier est un fond de carte physique, relief
    le deuxième correspond aux frontières des pays
    les coordonnées géographiques des deux fonds de carte sont identiques

    il y a un décalage de de 30°, comme si il y avait un problème de géoréférencement avec un SIG

    voilà mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    clear all;
     
    close all;
     
    %% chargement des données téléchargées depuis http://rimmer.ngdc.noaa.gov/coast/
     
    m_coord('geographic');
     
    [Z,LONG,LAT]=m_elev([-30 40 0 30]);
    X=load('29924.dat','-ascii');
     
    %% Affichage de l'image
     
    figure('Name','carte Afrique','NumberTitle','off');
     
    contourf(Z)
     
    %set(gca,'xticklabel',-30:10:40)
     
    hold on
     
    plot(X(:,1),X(:,2),'color','k','linewidth',1.5);
    le problème vient de l'axe des X, l'image donnée par contourf(Z) donne un axe qui part de 0 à 70 alors que l'image des frontières respectent les coordonnées réelles, -30 à 40
    du coup j'ai un décalage quand je les superpose

    est ce que quelqu'un a une idée pour ce problème d'axe??

    merci par avance

  2. #2
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Et bien au lieu de faire :force-lui aussi le X et le Y (car là par défaut il prend pour X et Y [1:length(Z)]),
    de ce que j'en comprends.
    Bon j'ai du mal à voir dans ton code à quoi ça correspond mais toi tu dois savoir non ?

    Si je prends l'exemple donné dans contourf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    z = peaks; 
    [c,h] = contourf(z);
    Par défaut les ordonnées et les abscisses vont de 1 à 49 (car Z est une matrice 49*49).
    Je modifie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    z = peaks; 
    [c,h] = contourf(-15:33,-2:46,z);
    C'est bien ça que tu veux ?
    Règles du Forum

    Adepte de la maïeutique

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    merci le code de la ligne qui allait pas est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    contourf(LONG,LAT,Z)
    merci pour l'aide

  4. #4
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    j'ai un problème supplémentaire qui vient de se poser

    j'ai rajouté pour une meilleure lisibilité du relief un vecteur v dans la fonction contourf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    v=[-6000 -500 -250 0 250 500 1000 1500 2000 2500];
     
    contourf(LONG,LAT,Z,v);
    j'aimerais savoir s'il est possible de définir les couleurs (choisir la légende en fait) suivant ce vecteur pour une meilleure distinction du relief

    qu'elle est la fonction à utiliser ou est ce que je dois créer moi même la légende??

    merci pour l'aide

  5. #5
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Je pense que tu dois pouvoir le faire avec la fonction COLORMAP.
    Règles du Forum

    Adepte de la maïeutique

  6. #6
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    merci pour l'info caro
    je me penche dessus

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    j'arrive à créer ma légende avec colormap mais je n'arrive pas à la faire correspondre avec mes classes créer avec contourf

    code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    %% Affichage de l'image
    figure('Name','carte Afrique','NumberTitle','off');
    map=[0 0 255;0 118 255;48 255 207;255 255 0;255 175 0;255 96 0;255 0 0;150 0 0;50 0 0]/255;
    colormap(map)
    v=[-6000 -500 -250 0 250 500 1000 1500 2000 2500];
    contourf(LONG,LAT,Z,v);
    hold on
    plot(X(:,1),X(:,2),'color','k','linewidth',1.5);
    ext ce que quelqu'un à une idée

  8. #8
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Je ne comprends pas ce que tu veux dire avec tes classes.

    Un truc : pour bien voir comment COLORMAP a agi sur tes couleurs tu peux utiliser la commande COLORBAR qui te permettra de visualiser la relation valeur/couleur.
    Règles du Forum

    Adepte de la maïeutique

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    c'est ce que j'ai fait

    les classes que j'ai créées avec colormap ne correspondent pas à mes valeurs

    dans le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    map=[0 0 255;0 118 255;48 255 207;255 255 0;255 175 0;255 96 0;255 0 0;150 0 0;50 0 0]/255;
     
    colormap(map)
     
    v=[-6000 -500 -250 0 250 500 1000 1500 2000 2500];
     
    caxis([-6000 2500])
     
    contourf(LONG,LAT,Z,v);
    il y a 9 classes soit 9 couleurs

    je voudrais que ma première classe (couleur 0 0 255) corresponde aux valeurs comprises entre -6000 et -500 (soit de v(1) à v(2))
    couleur (0 118 255) aux valeurs comprises entre - 500 et -250
    et ainsi de suite

    en fait je sais pas comment le faire dans le programme

    merci pour l'aide

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 160
    Points
    53 160
    Par défaut
    Citation Envoyé par niepoc Voir le message
    je voudrais que ma première classe (couleur 0 0 255) corresponde aux valeurs comprises entre -6000 et -500 (soit de v(1) à v(2))
    couleur (0 118 255) aux valeurs comprises entre - 500 et -250
    et ainsi de suite
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    map=[0 0 255;0 118 255;48 255 207;255 255 0;255 175 0;255 96 0;255 0 0;150 0 0;50 0 0]/255;
     
    colormap(map)
     
    v=[-6000 -500 -250 0 250 500 1000 1500 2000 2500];
     
    ZZ = ones(size(Z));
     
    for n=2:numel(v)-1
     
        idx = Z>v(n);
        ZZ(idx) = ZZ(idx)+1;
     
    end
     
    caxis([1 9])
     
    contourf(ZZ,1:9);
    ou sans la boucle FOR-END :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    map=[0 0 255;0 118 255;48 255 207;255 255 0;255 175 0;255 96 0;255 0 0;150 0 0;50 0 0]/255;
     
    colormap(map)
     
    v=[-6000 -500 -250 0 250 500 1000 1500 2000 2500];
     
    [pasbesoin,ZZ]=histc(Z,v)
     
    caxis([1 9])
     
    contourf(ZZ,1:9);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  11. #11
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    je voulais savoir s'il est possible d'afficher les valeurs correspondant à v
    code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v=[-6000 -500 0 250 500 1000 1500 2000 2500];
    sur la colorbar en lieu et place de 1,2,3,4,5...

    merci par avance

    voilà le code complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    figure('Name','carte Afrique','NumberTitle','off');
    map=[0 0 255;0 118 255;255 255 0;255 175 0;255 96 0;255 0 0;150 0 0;50 0 0]/255;
    colormap(map);
    v=[-6000 -500 0 250 500 1000 1500 2000 2500];
    [pasbesoin,ZZ]=histc(Z,v);
    caxis([1 8])
    contourf(LONG,LAT,ZZ);
    colorbar('location','eastoutside')
    hold on
    plot(X(:,1),X(:,2),'color','k','linewidth',1.5);
    echelle=m_scale;
    set(gca,'xtick',-30:2:40,'ytick',0:2:30,'fontweight','b')

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 160
    Points
    53 160
    Par défaut
    Il faut modifier les propriété de l'objet Colorbar qui n'est rien d'autre qu'un objet Axes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    figure('Name','carte Afrique','NumberTitle','off');
    map=[0 0 255;0 118 255;255 255 0;255 175 0;255 96 0;255 0 0;150 0 0;50 0 0]/255;
    colormap(map);
     
    v=[-6000 -500 0 250 500 1000 1500 2000 2500];
     
    c = colorbar;
    set(c,'ytick',1:9,'yticklabel',num2str(v.'))
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  13. #13
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    merci pour cettte réponse rapide

    j'ai une question concernant la légende

    avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A=plot(-1.5,15.35,'marker','d','markersize',9,'MarkerEdgeColor','m','MarkerFaceColor','m');
    je crée un marker pour identifier un lieu

    dans la légende, celui s'affiche comme si c'était une courbe, c'est à dire, un trait avec le marker au milieu
    celà est du à la fonction plot je pense, y' a til une autre fonction que plot pour créer un marker et éviter ce trait sur la légende???

    merci par avance

  14. #14
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 160
    Points
    53 160
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A=plot(-1.5,15.35,'marker','d', ...
        'markersize',9, ...
        'MarkerEdgeColor','m', ...
        'MarkerFaceColor','m',...
        'linestyle','none');
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  15. #15
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    merci beaucoup Dut pour ton aide si precieuse

  16. #16
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    je viens de m'apercevoir qu'il y a un décalage avec la color bar
    en effet avec le code de map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     map=[0 0 255;0 118 255;255 255 0;255 175 0;255 96 0;255 0 0;150 0 0;50 0 0]/255;
    je crée huit couleurs qui correspond aux intervalles entre mes neufs valeurs de v
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v=[-6000 -500 0 250 500 1000 1500 2000 2500];
    du coup avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set(c,'ytick',1:9,'yticklabel',num2str(v.'))
    il me prend que les huit premières valeurs de v

    l'idée est d'avoir pour chaque couleur la première et la dernière valeur de l'intervalle, soit -6000 et -500, -500 et 0, 0 et 250.....

    voilà le code en entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    figure('Name','carte Afrique','NumberTitle','off');
    map=[0 0 255;0 118 255;255 255 0;255 175 0;255 96 0;255 0 0;150 0 0;50 0 0]/255;
    colormap(map);
     
    v=[-6000 -500 0 250 500 1000 1500 2000 2500];
     
    c = colorbar;
    set(c,'ytick',1:9,'yticklabel',num2str(v.'))
    merci pour l'aide, je cherche de mon coté

Discussions similaires

  1. Graphes couleur du fond et fond de cartes
    Par hollowdeadoss dans le forum MATLAB
    Réponses: 4
    Dernier message: 25/05/2007, 11h24
  2. [Cartographie]Fonds de carte
    Par seb.49 dans le forum C#
    Réponses: 5
    Dernier message: 06/04/2007, 09h25
  3. Jframe : Problème de "superposition" image de fond / bouton SUITE
    Par NicolasGuyomar dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 18/03/2007, 14h06
  4. Jframe : Problème de "superposition" image de fond / bouton
    Par lottie dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 15/03/2007, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo