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

WinDev Discussion :

google maps offline [Sources]


Sujet :

WinDev

  1. #21
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    Citation Envoyé par courdi95 Voir le message
    oui .... je suis également sur cette piste là.

    D'ailleurs en voulant implémenter un bon tutorial se trouvant sur CodeProject, je suis tombé sur un os ....

    Pour faire le step 1 du tutorial en WD (http://www.codeproject.com/Articles/...g-MapWinGIS-an ), pas de souci .... hormis le fait que les constantes ne passent pas bien, mais c'est mineur ...

    Commande initiale (qui plante .... cela demande chargement de la DLL interop.mapwingis.dll)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AX_map>>CursorMode = MapWinGIS.tkCursorMode.cmNone
    Remplacée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AX_map>>CursorMode = 0
    ou
    AX_map>>CursorMode = 1
    Je me suis donc attaqué au step 2 (http://www.codeproject.com/Articles/...g-MapWinGIS-an), dans lequel on essaye de charger une table ...

    Voici mon code WD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //Create a new instance for MapWinGIS.Table
    //MapWinGIS.Table myTable = new MapWinGIS.Table();
    myTable est un objet Automation "MapWinGIS.Table"
     
    //Define the data source of Table instance
    //myTable.Open(@"D:\GISSampleData2\arabcntry.dbf", null);
    myTable>>open("C:\Temp\Desktop samples\arabcntry.dbf",null)
     
    // variantes essayées et qui ne marchent pas non plus :
    //myTable>>open("C:\Temp\Desktop samples\arabcntry.dbf","null")
    //myTable>>open("C:\Temp\Desktop samples\arabcntry.dbf")
    Et voilà l'erreur que j'obtiens (cela ressemble à l'erreur dont on a déjà parlé sur les "open" de shapefile et qu'on a détourné avec la commande "resource") : visiblement le passage de paramètre est problématique.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Erreur à la ligne 9 du traitement Clic sur BTN_resetsymbology1.
    Vous avez appelé la méthode Automation 'open'.
    En tentant d'invoquer la méthode <open> ou de lire la propriété <open>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80020005, Type incorrect pour le paramètre 2'
    En tentant d'invoquer la méthode <open>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80020005, Type incorrect pour le paramètre 2'
    En tentant de lire la propriété <open>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80020003, Le membre demandé n'existe pas' 
    En tentant d'écrire la propriété <open>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80020003, Le membre demandé n'existe pas'
     
    ----- Informations techniques -----
     
    Projet : DesktopGIS
     
    Appel WL :
    Traitement de 'Clic sur BTN_resetsymbology1' (FEN_Desktop_Part_2.BTN_resetsymbology1), ligne 9, thread 0
     
    Que s'est-il passé ?
    Vous avez appelé la méthode Automation 'open'.
    En tentant d'invoquer la méthode <open> ou de lire la propriété <open>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80020005, Type incorrect pour le paramètre 2'
    En tentant d'invoquer la méthode <open>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80020005, Type incorrect pour le paramètre 2'
    En tentant de lire la propriété <open>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80020003, Le membre demandé n'existe pas' 
    En tentant d'écrire la propriété <open>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80020003, Le membre demandé n'existe pas'
     
    Code erreur : 2205
    Niveau : erreur fatale (EL_FATAL)
     
    Dump de l'erreur du module 'wd180vm.dll' (18.0.77.3).
    Identifiant des informations détaillées (.err) : 130001
    Informations supplémentaires :
    EIT_PILEWL :
    Clic sur BTN_resetsymbology1 (FEN_Desktop_Part_2.BTN_resetsymbology1), ligne 9
    EIT_DATEHEURE : 15/01/2013 09:44:15
    @OnePoint : Tu avais dit avoir une solution : laquelle ?
    et en essayant de passer par des chaines ASCIIZ ?
    Emmanuel Lecoester
    => joomla addict.

  2. #22
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Bonjour à tous !
    Citation Envoyé par OnePoint Voir le message
    Si besoin, on peut contourner l'incompatibilité sur le passage de paramètres en encapsulant les appels aux méthodes qui posent problème, en utilisant un autre ActiveX pré-installé sur Windows: MSScriptControl.ScriptControl.
    ...A envisager ultérieurement.
    Citation Envoyé par courdi95 Voir le message
    Pour les méthodes "open", je crois qu'il faut y passer .... mais je ne l'ai jamais fait ....

    Tu essayes ?
    Voilà le code modifié, la procédure de contournement a besoin d'un objet automation dynamique.
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SfWorld est un objet Automation dynamique
    bRésultat est un booléen
     
    SfWorld = allouer un objet Automation "MapWinGIS.Shapefile"
     
    // L'exécution de la ligne ci-dessous provoque une erreur
    //bRésultat = SfWorld>>Open("c:\temp\world_adm0.shp")
     
    // Une solution de contournement basée sur un script VBS
    bRésultat = MapWinGIS_Open(SfWorld,"c:\temp\world_adm0.shp")
     
    AX_Map>>AddLayer(SfWorld,Vrai)
    La procédure de contournement utilise l'ActiveX "MSScriptControl.ScriptControl" pour exécuter un script VBScript qui invoque correctement la méthode Open() de l'objet automation.
    Attention: l'utilisation de cet ActiveX nous limite à une application 32 bits.
    Code WLangage : 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
    23
    24
     
    // Procédure utile pour exécuter la méthode Open() sur les objets automation de type:
    //	"MapWinGIS.Shapefile"
    //	"MapWinGIS.Table"
    //	"MapWinGIS.Tin" 
    //
    PROCEDURE MapWinGIS_Open(oObject est un objet Automation dynamique,sText est une chaîne)
    oScript est un objet Automation "MSScriptControl.ScriptControl" 
    sScript est une chaîne = [
    Function MapWinGIS_Open(oObject, sText)
        MapWinGIS_Open = oObject.open(sText,Nothing)
    End Function
    ]
    QUAND EXCEPTION DANS
    	oScript>>Language("VBScript")
    	oScript>>Reset
    	oScript>>AddCode(sScript)
    	oScript>>Timeout(-1) //pas de timeout
    	RENVOYER oScript>>Run("MapWinGIS_Open",oObject,sText)
     
    FAIRE
    	Erreur("Erreur exécution ScriptControl",ExceptionInfo(errInfo))
    	RENVOYER Faux
    FIN
    Code WinDev 16, testé sous Windows XP.


    [EDIT]
    Le contournement est inutile.
    Il suffit de passer en paramètre un objet automation dynamique non alloué, ce qui est équivalent à Nothing.
    [/EDIT]

  3. #23
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Génial !

    Bon j'essaye tout de suite sur mon PC W7 avec WD18 ! espérons que le 64 bits de l'OS ne va pas tout casser ...

    Je ferai un EDIT tout à l'heure !

  4. #24
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Triple buse !

    Cela marche !!!!!! sous W7 64 bits avec WD18.

    Ce n'est pas une étoile mais 5 que tu devrais avoir !!!!!!!!!!!!!!!!! C'est très rare une compétence comme celle-là.

    Encore bravo !

    Bon, je continue avec MapWinGIS, je commençais à désepérer, car par ailleurs DotSpatial a tendance à planter au chargement de plusieurs layers ... à moins que tu n'aies la solution ?

  5. #25
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Bonjour à tous !

    Finalement, le contournement n'est pas nécessaire si on prend le temps de créer une variable correctement typée qui sera passé en paramètre.

    C'est une "règle pratique" déjà vraie pour un appel d'API.
    Eh bien ça se vérifie aussi pour les méthodes des objets automation.

    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    oNothing est un objet Automation dynamique   // ne pas allouer, donc vaut Nothing, idem Null
    SfWorld est un objet Automation dynamique    // à allouer
    bRésultat est un booléen
     
    SfWorld = allouer un objet Automation "MapWinGIS.Shapefile"
     
    bRésultat = SfWorld>>Open("c:\temp\world_adm0.shp",oNothing)
     
    AX_Map>>AddLayer(SfWorld,Vrai)
    ... tout simplement.

    Maintenant que j'ai enfin compris, je constate qu'une version non dynamique de l'objet MapWinGIS fonctionne aussi.

    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    oNothing est un objet Automation dynamique  // ne pas allouer, donc vaut Nothing, idem Null
    SfWorld est un objet Automation "MapWinGIS.Shapefile"
    bRésultat est un booléen
     
    bRésultat = SfWorld>>Open("c:\temp\world_adm0.shp",oNothing)
     
    AX_Map>>AddLayer(SfWorld,Vrai)

    @courdi95 : inutile de s'embêter !

  6. #26
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Encore bravvvOOOO ...je mets encore un pouce+1 sur ton post ! (je ne peux pas en mettre plusieurs ... dommage).

    Je vois que tu as des ressources .... je te propose un nouveau challenge !

    J'ai continué la traduction de l'exemple (part 2 : http://www.codeproject.com/Articles/...g-MapWinGIS-an ) .... et je bute dans la procédure qui permet de redessiner les couleurs de la carte en fonction de la population des pays ("quantitative symbology").

    Voici mon code WINDEV (j'ai laissé le code d'origine en commentaires) :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    bRésultat est un booléen
     
    //Create a new instance for MapWinGIS.Table
    ///MapWinGIS.Table myTable = new MapWinGIS.Table();
    myTable est un objet Automation dynamique
    myTable = allouer un objet Automation  "MapWinGIS.Table"
     
    //Define the data source of Table instance
    //myTable.Open(@"D:\GISSampleData2\arabcntry.dbf", null);
    // Une solution de contournement basée sur un script VBS
    bRésultat = MapWinGIS_Open(myTable,"C:\Temp\Desktop samples\arabcntry.dbf")
     
    ////Define the index of the field will used in symbology
    //int myFieldIndex = 1;
    nMyFieldIndex est un entier = 1;
     
    ////Get the number of rows in the table
    //int numberOfRows = myTable.NumRows;
    nUmberOfRows est un entier
    nUmberOfRows = myTable>>NumRows
     
    ////Create an array to store the cell values of the field
    //double[] myCellsValues = new double[numberOfRows];
    tabMyCellsValues est un tableau de nUmberOfRows réels
     
    rMinvalue est un réel = 999999999999999999
    rMaxvalue est un réel = -999999999999999999
     
    ////Populate the array with cell values restored from the Table instance
    POUR i=1 _A_ nUmberOfRows-1
    	tabMyCellsValues[i] = myTable>>CellValue(1,i)
    	SI tabMyCellsValues[i] > rMaxvalue ALORS
    		rMaxvalue = tabMyCellsValues[i]
    	FIN
    	SI tabMyCellsValues[i] < rMinvalue ALORS
    		rMinvalue = tabMyCellsValues[i]
    	FIN
    FIN
     
    //for (int i = 0; i < numberOfRows - 1; i++)
    //{
    //myCellsValues[i] =
    //System.Convert.ToDouble(myTable.get_CellValue(1, i));
    //}
     
    ////Get the minimum and maximum values
    //double minValue = myCellsValues.Min();
    //double maxValue = myCellsValues.Max();
     
    //////////////////////////////////
    ////Create a new instance for MapWinGIS.ShapefileColorScheme
    //MapWinGIS.ShapefileColorScheme myScheme = 
    //new MapWinGIS.ShapefileColorScheme();
    myScheme est un objet Automation dynamique
    myScheme = allouer un objet Automation "MapWinGIS.ShapefileColorScheme"
     
    ////Set the layer handler to the MapWinGIS.ShapefileColorScheme instance
    //myScheme.LayerHandle = intHandler;
    myScheme>>LayerHandle = nLayerHandler
     
    ////Set the field index to use in symbology
    //myScheme.FieldIndex = myFieldIndex;
    myScheme>>FieldIndex = nMyFieldIndex
     
    //////////////////////
    ////Create a new instance for MapWinGIS.ShapefileColorBreak 
    //MapWinGIS.ShapefileColorBreak myBreak = 
    //new MapWinGIS.ShapefileColorBreak();
    myBreak est un objet Automation dynamique
    myBreak  = allouer un objet  Automation  "MapWinGIS.ShapefileColorBreak"
     
    ////Set the minimum value in the field as a start value
    //myBreak.StartValue = minValue;
    myBreak>>StartValue = rMinvalue
     
    ////Set the start color of the scheme
    //myBreak.StartColor =
    //(UInt32)(System.Drawing.ColorTranslator.ToOle
    //(System.Drawing.Color.Aqua));
    myBreak>>StartColor = Blanc
     
    ////Set the maximum value in the field as an end value
    //myBreak.EndValue = maxValue;
    myBreak>>EndValue = rMaxvalue
     
    ////Set the end color of the scheme
    //myBreak.EndColor =
    //(UInt32)(System.Drawing.ColorTranslator.ToOle
    //(System.Drawing.Color.DarkBlue));
    myBreak>>EndColor = Noir
     
    ////Add the break to the color scheme
    //myScheme.Add(myBreak);
    myScheme>>add(myBreak)
     
    ////Upgrade display using the scheme
    //axMap1.ApplyLegendColors(myScheme);
     
    AX_map>>ApplyLegendColors (myScheme)
    Le bug se produit lorsqu'on essaye de créer l'objet MyScheme en tant que 'MapWinGIS.ShapefileColorScheme' .... visiblement il ne le voit pas : c'est faux car si j'enlève les quotes l'autocomplétion en saisie du code me présente bien ShapefileColorScheme ...

    Ci-après le dump WD (remarque : meme souci avec myBreak un peu plus loin dans le 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
    23
    24
    Erreur à la ligne 56 du traitement Clic sur BTN_resetsymbology1.
    L'objet automation 'MapWinGIS.ShapefileColorScheme' n'est pas installé sur votre système.
     
    ----- Informations techniques -----
     
    Projet : DesktopGIS
     
    Appel WL :
    Traitement de 'Clic sur BTN_resetsymbology1' (FEN_Desktop_Part_2.BTN_resetsymbology1), ligne 56, thread 0
     
    Que s'est-il passé ?
    L'objet automation 'MapWinGIS.ShapefileColorScheme' n'est pas installé sur votre système.
     
    Code erreur : 2202
    Niveau : erreur fatale (EL_FATAL)
     
    Dump de l'erreur du module 'wd180vm.dll' (18.0.77.3).
    Identifiant des informations détaillées (.err) : 2202
    Informations de débogage :
    Instruction AutomCreate
    Informations supplémentaires :
    EIT_PILEWL :
    Clic sur BTN_resetsymbology1 (FEN_Desktop_Part_2.BTN_resetsymbology1), ligne 56
    EIT_DATEHEURE : 15/01/2013 22:21:25

  7. #27
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par courdi95 Voir le message
    Je vois que tu as des ressources .... je te propose un nouveau challenge !
    Attention à ne pas abuser des bonnes choses.

    Citation Envoyé par courdi95 Voir le message
    J'ai continué la traduction de l'exemple (part 2 : http://www.codeproject.com/Articles/...g-MapWinGIS-an ) .... et je bute dans la procédure qui permet de redessiner les couleurs de la carte en fonction de la population des pays ("quantitative symbology").
    Après avoir rapidement regardé le code, je te mets tout de suite en garde sur la gestion des tableaux.

    En WLangage c'est simple, la première cellule d'un tableau unidimensionnel commence toujours à l'index 1: on dit que le tableau est "de base 1".
    Et quand tu spécifies:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabMyCellsValues est un tableau de 10 réels
    alors 10 est la taille de la dimension du tableau.

    Ce n'est pas forcément le cas du côté Automation où un tableau est par défaut "de base 0".
    Mais pire que ça, tu peux définir l'étendue du tableau, du genre index 5 à 10:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim unTableau(5 To 10) As String
    ou pourquoi pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim unTableau(-5 To 5) As String
    Ici les valeurs entre parenthèses ne donnent pas la taille de la dimension.
    Ces nombres donnent la valeur d'index minimale et maximale de la dimension.

    Donc le code suivant signifie un tableau unidimensionnel d'index mininum=0 et d'index maximum=5, par conséquent la dimension du tableau=6.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim unTableau(5) As String
    Maintenant tu es au courant du piège.

    La plupart du temps les tableaux automation sont de base 0.
    Alors comment ça se passe si on veut passer un tableau WLangage de base 1 à une méthode automation qui attend un tableau bas 0 !?

    Heureusement, le WLangage a prévu le coup et se charge d'adapter la base du tableau lorsqu'il est transmis en paramètre d'une méthode Automation.

    Mais parfois, la méthode Automation attend un tableau de base 1 !
    (et là pour le deviner faut être une voyante. Excel est un exemple où les tableaux automation sont de base 1)
    Le WLangage nous donner le moyen de contrôler les passages de certains paramètres, et en particulier adapter la base du tableau.
    Regarde l'aide de la fonction AutomationParamètre
    http://doc.pcsoft.fr/fr-FR/?3013014&...metre_fonction.

    De tout ça il ressort que quand tu transmets un tableau WLagngage comme paramètre d'une méthode Automation, il faut toujours se poser la question de la base du tableau pour savoir si on le laisse adapter en base 0 par le WLangage, ou si on le force en base 1.

  8. #28
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Merci pour cette reponse tres bien documentée.

    Malheureusement le souci n'est pas a cet endroit mais carrement au moment de la creation de l'objet dans l'instruction:

    myScheme = allouer un objet Automation "MapWinGIS.ShapefileColorScheme"

  9. #29
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par courdi95 Voir le message
    Merci pour cette reponse tres bien documentée.

    Malheureusement le souci n'est pas a cet endroit mais carrement au moment de la creation de l'objet dans l'instruction:

    myScheme = allouer un objet Automation "MapWinGIS.ShapefileColorScheme"
    Je sais bien que ce n'est pas le souci.
    Mais c'est un problème de première importance pour la conversion en WLangage du code que tu nous a donné en référence.

    Ensuite, je te confirme que pour une raison encore "mystérieuse" je n'arrive pas non plus à allouer directement "MapWinGIS.ShapefileColorScheme".

    En fait les classes (des bibliothèques Automation) qui peuvent être allouées directement par le WLangage sont enregistrées dans la base du registre Windows.
    Et apparemment toutes les classes de MapWinGIS n'y sont pas inscrites.

  10. #30
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    1. Pour la dimension des tableaux : effectivement il faut que je fasse attention. Merci de m'avoir signalé ce point

    2. Pour la classe non accessible : cela me rassure que ce pb soit reproductible. Est ce qu'on peut charger un dll pour resoudre ce point ? Sur google on trouve des posts qui indique ce phénomène lors de multi threads ..... ce n'est pas le cas ici mais est ce une piste ? Peut etre ne peut on pas instancier un objet deja fait de maniere implicite ?

  11. #31
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    ATTENTION .... mon post mérite plein de pouces + 1 !!!!!
    [EDIT] non non .... voir plus loin[EDIT]

    Car je pense, en toute modestie , avoir trouvé la solution !
    [EDIT] non non .... voir plus loin[EDIT]


    En surfant sur internet, un truc m'a mis la puce à l'oreille : les personnes voulant utiliser MapWinGIS dans SharpDevelop n'utilise en fait pas l'ActiveX ! Mais des DLL .NET générées à l'aide d'un outil Microsoft (si je retrouve le post précis je mettrai sa référence ici).

    Donc, en fait, les développeurs utilisent deux DLLs :
    AxInterop.MapWinGis.DLL
    Interop.MapWinGIS.DLL

    que l'on trouve dans le répertoire du programme MapWindow (4.8). Donc pas besoin de les regénérer soit même avec l'outil MS.

    Le TRUC, c'est travailler dans WD, non pas avec des objets Automation (dont on vient de voir les limites .... ), mais avec des classes .NET.

    Ce que j'ai fait :
    - demander à WD d'utiliser les assemblages .NET correspondant aux DLLs que je suis allé chercher dans le répertoire de MapWindow
    - créer un objet .NET dans la fenêtre et y associer la classe AxMap que l'on trouve dans l'arborescence de AxInterop
    - et ensuite ne plus jouer qu'avec cela ! la petite subtilité, c'est d'utiliser "MapWinGIS.ShapefileClass" au lieu de "MapWinGIS.Shapefile" par exemple ....

    Pour le chargement d'une shapefile, cela donne cela (j'ai un champ Automation "AX_map" et un champ .NET "DOTNET_AX_map" dans ma fenêtre) :

    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
     
    // objet Automation
    autShapefile est un objet  Automation "MapWinGIS.Shapefile"
    // objet .NET
    gclShapeFile est un objet MapWinGIS.ShapefileClass
     
    nom_fichier est une chaîne = "C:\Temp\Desktop samples\arabcntry.shp"
     
    // version Automation
    autShapefile>>Resource(nom_fichier)
    nLayerHandler = AX_map>>AddLayer(autShapefile,-1)
     
    // version .NET
    gclShapeFile.Resource (nom_fichier)
    DOTNET_AX_map.AddLayer (gclShapeFile,Vrai)
    Pour le chargement du shf, c'est OK .... Je vais vérifier si le reste fonctionne ...

  12. #32
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Le changement de couleur fonctionne !

    Petite subtilité : ne pas oublier de faire un Refresh !!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DOTNET_AX_map.set_ShapeLayerFillColor(gnHLayer,JauneClair)
    DOTNET_AX_map.set_ShapeLayerLineColor(gnHLayer,RougeClair)
    DOTNET_AX_map.Refresh()

  13. #33
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Bon, je me suis emballé ....

    Pour les tables, cela ne fonctionne pas ... ou encore une fois, je m'y prends mal ....

    Si j'utilise l'objet Automation et grâce à l'astuce trouvée par OnePoint hier, on arrive à ouvrir cette fichue table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //////////////////////////////////////////////////////
    //Create a new instance for MapWinGIS.Table
    ///MapWinGIS.Table myTable = new MapWinGIS.Table();
    myTable est un objet Automation "MapWinGIS.Table"
     
    //Define the data source of Table instance
    //myTable.Open(@"D:\GISSampleData2\arabcntry.dbf", null);
    oNothing est un objet Automation dynamique  // ne pas allouer, donc vaut Nothing, idem Null
    bRésultat = myTable>>Open("C:\Temp\Desktop samples\arabcntry.dbf",oNothing)
    //////////////////////////////////////////////////////
    Si je transpose en .NET :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ////////////////////////////////////////////////////////
    //Create a new instance for MapWinGIS.Table
    ///MapWinGIS.Table myTable = new MapWinGIS.Table();
    clMyTable est un objet MapWinGIS.TableClass 
     
    //Define the data source of Table instance
    //myTable.Open(@"D:\GISSampleData2\arabcntry.dbf", null);
    sNom_table est une chaîne UNICODE
    sNom_table = "C:\Temp\Desktop samples\arabcntry.dbf"
    clMyTable.Open(sNom_table,Null)
    ////////////////////////////////////////////////////////
    et là, badaboum ... j'ai un plantage sur l'open !

    @OnePoint : il faudrait encore une idée de génie SVP !

    (remarque : dans le code d'origine il y a un @ devant le nom ... une piste ?)

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Erreur à la ligne 14 du traitement Clic sur BTN_quantitative_symbology.
    Le framework .NET a renvoyé l'erreur suivante : 
    Une exception a été levée par la cible d'un appel.
     
    ----- Informations techniques -----
     
    Projet : DesktopGIS
     
    Appel WL :
    Traitement de 'Clic sur BTN_quantitative_symbology' (FEN_Desktop_Part_2.BTN_quantitative_symbology), ligne 14, thread 0
     
    Que s'est-il passé ?
    Le framework .NET a renvoyé l'erreur suivante : 
    Une exception a été levée par la cible d'un appel.
     
    Code erreur : 200007
    Niveau : erreur fatale (EL_FATAL)
     
    Dump de l'erreur du module 'wd180net4.dll' (18.0.7.0).
    Identifiant des informations détaillées (.err) : 200007
    Informations de débogage :
    System.Reflection.TargetInvocationException: Une exception a été levée par la cible d'un appel. ---> System.Runtime.InteropServices.COMException: Le type ne correspond pas. (Exception de HRESULT : 0x80020005 (DISP_E_TYPEMISMATCH))
       --- Fin de la trace de la pile d'exception interne ---
       à System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
       à System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
       à CDotNetType.bInvoke(CDotNetType* , Object gcrObj, Char* pszNomMethode, CSLevel* pclPile, Int32 nNbParamPile, Int32 bValeurRetour, STOperationDotNet* pstOperation)
       à CDotNetType.bInvoke(CDotNetType* , Object gcrObj, STMethodeDotNet* pstMethode, UInt32* pdwIdentifiant, CSLevel* pclPile, Int32 nNbParamPile, Int32 bValeurRetour, STOperationDotNet* pstOperation)
       à CDotNetInstance.bAppelleMethode(CDotNetInstance* , STMethodeDotNet* pstMethode, UInt32* pdwIdentifiant, CSLevel* pclPile, Int32 nNbParamPile, Int32 bValeurRetour, STOperationDotNet* pstOperation)
    Informations supplémentaires :
    EIT_PILEWL :
    Clic sur BTN_quantitative_symbology (FEN_Desktop_Part_2.BTN_quantitative_symbology), ligne 14
    EIT_DATEHEURE : 16/01/2013 09:09:41

  14. #34
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 201
    Points : 9 188
    Points
    9 188
    Par défaut
    Je ne suis pas la discussion, je n'y connais rien en .net mais j'ai vu qqchose pour le code d'erreur 200007 : mettre en dynamique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clMyTable est un objet MapWinGIS.TableClass dynamique
    Sans garantie aucune...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  15. #35
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    @frenchsting : merci pour le tuyau .... mais cela ne marche pas

    On compte tous sur OnePoint ! Je suis sur qu'il va trouver la solution...

    En attendant, je pourrais faire un mix :
    - objet Automation pour utiliser l'ActiveX sur les Table (dans l'exemple on ne fait que la lire en parcourant le .dbf )
    - objet .NET pour le reste ...

    Mais ce n'est pas top ... je préfère éviter de mélanger, maintenant qu'on a trouvé l'astuce .NET pour utiliser MapWinGIS !

  16. #36
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    Bonjour

    Petit bilan intermediaire sur l'integration d'une api gis dans windev:

    - api qgis : pas d'avancee particuliere ; je n'ai pas trouve comment interfacer ou integrer l'api qgis dans wd. Par ailleurs, le pilotage a l'air super pointu si on se refere a la doc et aucun tutoriel n'est dispo sur le web

    - dospatial (.net) : semblait etre une solution intéressante, toutefois des plantages violents au chargement de plusieurs layers m'ont fait abandonner cette solution

    - mapwingis (activex) : mapwingis existe en fait sous une forme activex et sous une forme .net ; dans la version activex, le controle a l'air de bien fonctionner mais des subtilites de manipulation des methodes et des parametres sont a prendre en compte (voir le post de onepoint sur l'utilisation de la fonction open) . Par ailleurs, certaines classes de l'activex ne sont pas declarees dans la base de registre (ex table), ce qui empeche son utilisation au final

    - mapwingis (.net) : si on installe mapwindows on peut recuperer dans le repertoire du programme deux dlls d'interoperabilite (voir mon post plus haut) qui permettent de charger mapwingis en tant qu'assemblage .net. Cela semblait super prometteur car plus simple à utiliser et surtout les classes sont toutes visibles. Mais là, encore un souci pour utiliser la methode open, non plus sur un shapefile mais sur une table (voir mon post precedent)

    Devant cette situation de blocage, j'ai donc repris la recherche sur le web et je viens de trouver un autre assemblage que je vais tester :

    - easy gis .net : il m'a l'air bien et simple d'utilisation ... a suivre donc.

    Si vous avez des remarques, postez. Et si vous etes content de mon post : pouce +1.

  17. #37
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 201
    Points : 9 188
    Points
    9 188
    Par défaut
    Merci pour le retour complet : j'ai plussé !

    Je rebondis sur le message auquel j'avais répondu : le "@" signifie-t'il que c'est l'adresse qu'il faut passer ? Comme en W-language, l'adresse est "&" devant le nom de la variable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clMyTable.Open(&sNom_table,Null)
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  18. #38
    Membre éprouvé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Points : 1 075
    Points
    1 075
    Par défaut
    J'ai deja essayé le coup du & ... cela ne marche pas mieux car provoque u'n pb de compilation ... :-(

    J'espere que onepoint viendra sur le forum ... mes competences ne sont pas suffisantes pour resoudre ce point.

    Est ce que tu as essaye d'integrer l'assemblage .net de mapwingis dans un projet wd ?

  19. #39
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 201
    Points : 9 188
    Points
    9 188
    Par défaut
    Non pas du tout. Je n'y connais absolument rien en .net et en cartographie...

    Je vais essayer ce soir pour le fun.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  20. #40
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Bonjour,
    Citation Envoyé par courdi95 Voir le message
    J'ai continué la traduction de l'exemple (part 2 : http://www.codeproject.com/Articles/...g-MapWinGIS-an ) .... et je bute dans la procédure qui permet de redessiner les couleurs de la carte en fonction de la population des pays ("quantitative symbology").

    Voici mon code WINDEV (j'ai laissé le code d'origine en commentaires) :
    [ ... ]
    Le bug se produit lorsqu'on essaye de créer l'objet MyScheme en tant que 'MapWinGIS.ShapefileColorScheme' .... visiblement il ne le voit pas : c'est faux car si j'enlève les quotes l'autocomplétion en saisie du code me présente bien ShapefileColorScheme ...
    En fait, la bibliothèque MapWinGIS a évolué depuis ce tutoriel et la manière de gérer les couleurs a changé.
    Ajout de la classe ShapefileCategory associée à la classe Shapefile via le membre Categories dont le type de classe est ShapefileCategories.

    Avantage: les données sont prises en compte automatiquement. Plus besoin de constuire la Table. Il n'est plus nécessaire de déterminer les valeurs min / max. Donc plus besoin de tableau.

    Dans les commentaires du tutoriel, il faut lire les interventions de l'internaute starWolf qui montre comment s'y prendre.

    Je te donne un extrait de son code donné dans son message du 14 février 2012:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //Generate Categories
    myShapefile.Categories.Generate(myFieldIndex, MapWinGIS.tkClassificationType.ctNaturalBreaks, 25);
    myShapefile.Categories.ApplyExpressions();
     
    //Create a new instance for MapWinGIS.ShapefileColorScheme
    MapWinGIS.ColorScheme myScheme = new MapWinGIS.ColorScheme();
    myScheme.SetColors2(MapWinGIS.tkMapColor.Aqua, MapWinGIS.tkMapColor.DarkBlue);
    myShapefile.Categories.ApplyColorScheme(MapWinGIS.tkColorSchemeType.ctSchemeGraduated, myScheme);
     
    axMap1.Redraw(); // Not in his code, but it forces an immediate redraw of the control so you can see your colors
    Et je te cite une de ses explications:
    Citation Envoyé par starWolf 12 juin 2012
    The Wisam code didn't work because newer versions of MapWinGIS don't work the same. The preferred method of coloring individual shapes in newer versions is to use color schemes. He may have changed it by now, I don't know.

    As for the database, it is already loaded with the shapes. When you specify the shapes file MapWinGIS will look for a file of the same name with the extension dbf and load that underneath the covers, as it were. You don't have to explicitly load it. when you do the
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shapeFile.Open(sShapeFullFileName + ".shp", null);
    it will also find the dbf file if it has the same name and path. So the myFieldIndex variable finds the column in the dbf to create the color scheme on.

    The line
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shapeFile.Categories.Generate(myFieldIndex, MapWinGIS.tkClassificationType.ctNaturalBreaks, 25);
    tells the code to take the minimum and maximum values from column "myFieldIndex" and divide that range into 25 different cells, or buckets.

    The line
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myScheme.SetColors2(MapWinGIS.tkMapColor.Aqua, MapWinGIS.tkMapColor.DarkBlue);
    tells the code to color each bucket in a gradient from Aqua to DarkBlue. The rest of the code is applying the gradient scheme to the shapes and redrawing.

Discussions similaires

  1. Google Maps Offline
    Par you.baddi dans le forum API standards et tierces
    Réponses: 14
    Dernier message: 14/06/2012, 11h08
  2. Google Maps Offline
    Par you.baddi dans le forum Actualités
    Réponses: 3
    Dernier message: 07/06/2012, 11h55
  3. [SimpleXML] Google Maps, Problème d'encoding dans une boucle
    Par yahn dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/09/2006, 19h40
  4. [google maps] probleme avec ie
    Par kowabounga dans le forum Général Python
    Réponses: 1
    Dernier message: 14/09/2006, 15h20
  5. 4D & Google Maps
    Par gbardy dans le forum 4D
    Réponses: 1
    Dernier message: 30/06/2006, 07h32

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