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

Bases de données Delphi Discussion :

[D7]+[MapX]+[ODBC]+[ACCESS]


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 10
    Par défaut [D7]+[MapX]+[ODBC]+[ACCESS]
    Bonjour

    Le titre du sujet en dit beaucoup
    je suis en train d'essayer de piloter MapX qui est un activeX, et je n'arrive pas à créer une relation dynamique entre BDD et Carte.
    dans un premier temps est ce que quelqu'un connait MapX ?

    merci
    mais je ne me fais pas trop d'illusion car c'est tellement particulier

    Laurent

  2. #2
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Par défaut
    je croix que ya de bons exemples en delphi qui sont livrés avec MAPX et qui expliquent comment utiliser une connexion ODBC. mais un conseil faut pas chercher à creer une connexion avec BDE.
    Avec Access faut utiliser les composants ADO, ca marche tres bien.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 10
    Par défaut
    merci chebreg

    mais les quelques exemples founi n'utilisent pas de base de donnée, c'est juste un stockage fichier les fameux .DAT .TBL, mais avec ça ne ne peut pas faire un vrai SGBDR. Mais c'est vrai qu'apres je ne peut pas facilement récupérer les infos dans MapInfo.
    Mais peu importe je dois réaliser une appli autonome sans besoin de MapInfo et ce fameux MapX m'a l'air bien génial, il y a d'autre produit directement VCL comme EasyMap mais pas de possibilité de mettre une image géoréférencée ou alors TatukGis qui est plus puissant mais là je n'ai vraiment pas un seul exemple.

    Merci quand meme
    Laurent

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Par défaut
    voici 3 routines qui pouront t'aider

    1 - AjouterCoucheGeo : fonction permet d'ajouter une couche géographique (specifiée par le chemain du fichier) dans un composant MapX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function AjouterCoucheGeo(File:TFileName; NameOfLayer:String; Map:TMap; Visible:Boolean=True):CMapXLayer;
    begin
      // Chargement d'une couche géographiques
      try
        Result:=Map.Layers.Add(File,1);
        Result.Name:= NameOfLayer;
        Result.Visible:=Visible;
      excet
        Result:=nil;
      end;
    end;
    2- AjouterADODataset : permet d'associer un ensemble de données ADO (TADOTable, TADOQuery ...) a une couche géo dans un composant MAPX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function AjouterADODataset(DS:TCustomADODataSet; NameOfDs:String; GeoField:String; OnMap:TMap; ToLayer:CMapXLayer):CMapXDataSet;
    begin
      // Chargement d'un ensemble de données ADO sur une couche Géo
      try
        Result:=Map.Datasets.Add(miDataSetADO,DS.Recordset,NameOfDs, GeoField, EmptyParam, Tolayer, EmptyParam, EmptyParam);
      except
        Result:=nil;
      end;
    end;
    3- AjouterUneSegmentation : un exemple d'ajout d'une couche thématique pour analyser un champ d'un Dataset associé precedemment à une couche géographique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fuction AjouterUneSegmentation(MapXDS:CMapXDataSet; WithField, Name:String):CMapXTheme;
    begin
      try
        Result:=MapXDS.Themes.Add(miThemeRanged, WithField, Name, True);
      except
        Result:=nil;
      end;
    end;
    voila, j'espere que cela t'a parmis d'avoir une idée sur l'utilisation d'une base de donnée avec MAPX.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 10
    Par défaut
    encore une fois merci Chebreg

    je vais essayer de mettre en application tout ça.
    si j'ai d'autres petites questions puis je te resoliciter :

    c'est important pour moi de connaitre une personne qui sait utiliser MapX.
    Dans mon entourage c'est le desert

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Par défaut
    Citation Envoyé par Laurent de marseille
    si j'ai d'autres petites questions puis je te resoliciter :
    Oui, no probleme

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 10
    Par défaut
    Bonjour Chebreg

    Voici ma premiere question :
    - j'ai posé sur un form un carte "Map1" et celle ci est bien géoréferencée grace aux .TAB créé avec MapInfo
    - j'ai mis les button standard Zoom+ Zoom- Déplacement

    jusque là pas de soucis.

    ensuite j'ai créé une table (access) avec
    [X] : float
    [Y] : float
    [NumTerrain] : String
    J'ai posé une Dbgrid "DBGid1" avec un DBNavigator

    pour relier tout ça j'ai posé une Database+Table+Datasource, tout ça c'est tres classic

    et là ça deviens un peu plus difficile

    j'ai posé un button "XY" qui me permet en cliquant sur la carte de voir apparaitre mon point, je récupère les X et Y et je les rentre dans ma table.
    Code du button :
    -------------------------------------------------------------------------------------
    code button
    -------------------------------------------------------------------------------------
    procedure TForm1.XYClick(Sender: TObject);
    begin
    Map1.CurrentTool := PLOT_VEHICLE_TOOL;
    end;
    -------------------------------------------------------------------------------------
    code suivant
    -------------------------------------------------------------------------------------
    procedure TForm1.Map1ToolUsed(ASender: TObject; ToolNum: Smallint; X1, Y1,
    X2, Y2, Distance: Double; Shift, Ctrl: WordBool;
    var EnableDefault: WordBool);
    var
    fNewSymbol: Variant;
    fMapSymbol: Variant;
    fFtrFactory : Variant;
    //pItem : Variant;
    newObj : Variant; // Used for storing new feature object
    pt : Variant; // Used for storing point of click
    pts : Variant; // Used for storing collection of points
    ftrs : Variant; // Used for storing collection of features
    begin
    Case ToolNum of
    CUSTOM_POINT_TOOL :
    // Set feature type to be a symbol, set its style & XY values.
    // Add it to editing layer
    begin
    // Create standAlone feature object
    fFtrFactory := Map1.FeatureFactory;

    // Create point object to pass to CreateSymbol
    pt := CreateOleObject('MapX.Point.5');
    pt.Set(X1, Y1);
    edit1.Text:= floattostr(X1); // C'est là que je récupère les X Y
    edit2.Text:= floattostr(Y1);

    newObj := Map1.FeatureFactory.CreateSymbol(pt, Map1.DefaultStyle);
    EditLayer.AddFeature(newObj);

    Table1.Append;
    Table1.FieldByName('X').AsFloat :=X1; // je les écrit dans a base
    Table1.FieldByName('Y').AsFloat :=Y1;
    Table1.FieldByName('NumIRE').AsString :=FloatToStr(Y1);
    Table1.Post;
    Table1.Refresh;

    VarClear(fNewSymbol);
    VarClear(fMapSymbol);
    end;

    end;//Case
    // UnAssign Variant Variable
    VarClear(newObj);
    end;
    -------------------------------------------------------------------------------------
    dans form activate il y a :
    -------------------------------------------------------------------------------------
    procedure TForm1.FormActivate(Sender: TObject);
    var
    empty: Variant;
    unusedVt: OleVariant;
    MyFont: TFont;
    begin

    upDate_EditCombo;
    TVarData(empty).vType := varError;
    TVarData(empty).vError := 2147614724; // DISP_E_PARAMNOTFOUND;

    Map1.CreateCustomTool(PLOT_VEHICLE_TOOL, miToolTypePoint, miSizeCursor, miSizeCursor, miSizeCursor, unusedVt);

    MyFont := TFont.Create;
    OleFontToFont(Map1.DefaultStyle.SymbolFont, MyFont);
    MyFont.Size := 24;
    MyFont.Name := 'MapInfo Transportation';
    Map1.DefaultStyle.SymbolCharacter := 66;

    Map1.CreateCustomTool(CUSTOM_POINT_TOOL, miToolTypePoint, miSymbolCursor, miArrowCursor, miArrowCursor, empty);
    end;


    mais je remarque 2 choses :
    1 les points se sont inscrit dans le fichier .TAB
    2 Il n'y a pas de relation entre la carte et la base.

    Je me doute que tu ne pourras pas me dire en 2 mots pourquoi je n'ecris pas le point dans la base ni pourquoi il n'y a pas d'interactivité, c'est à dire si je selectionne un enregistrement ça ne selectionne pas un point sur la carte.

    aurais tu un exemple tres tres simple à m'envoyer, j'exagere peu etre, mais je suis tres motivé c'est pour ça que je fonce

    un grand merci pour ce que tu pourras
    Laurent

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Par défaut
    mais je remarque 2 choses :
    1 les points se sont inscrit dans le fichier .TAB
    2 Il n'y a pas de relation entre la carte et la base.
    Réponse pour 1
    C'est normal tu est entrain d'editer la couche (en ajoutant des points), ces changements sont répércutés sur le fichier .tab (a noter que cette fonctionnalité est très interessante si en veux générer des carte par program.)
    ==> pour eviter cela je te propose de créer un Layer temporaire que tu va utiliser pour ajouter tes nouveaux points

    // tu aura besoin d'une vriable globale qui va referencer le Layer temporaire
    et des deux routines suivantes
    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
    // fonction pour créer une couche temporaire
    function GenerateTempLayer(MAP:TMap; NameOfLayer:String):Layer;
    begin
      Result:=Map.Layers.CreateLayer(NameOfLayer, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
      Result.Editable:=True;
      Map.Layers.InsertionLayer:=Result;
    end;
     
    // fonction pour Ajouter un point sur la couche
    function AddPoint(X,Y:Double; Map:TMap; Lyr:Layer):Feature;
    var
      pt: Point;
    begin
      pt := CoPoint.Create;
      pt.Set_(X, Y);
      Result := Map.FeatureFactory.CreateSymbol(pt, Map.DefaultStyle);
      Lyr.AddFeature(Result, EmptyParam);  
    end;
    N!:faut aussi faire attention à ce que Map.DefaultStyle soit bien configuré

    Réponse pour 2
    Il n'y a pas de relation entre la carte et la base.
    MapX est un outil de cartographie, il n'est pas fait pour la manipulation (mise à jour) dirrecte de base de données. par contre il offre des fonctionalités de chargement et de visualisation de données de tables ou de requêtes. la fonctionnalités la plus interessante pour ton cas c'est le "DataBinding". avec ça tu peut charger le contenu d'un Dataset dirrectement sur ta carte, le resultat sera stocké dans un dataset (format propre a Mapx) et affecté à un Layer (couche géo). les types de "Binding" sont tres nombreux, mais pour ce qui est de ton problème, y a un type tres interessant. c'est le "Dataset Layer" qui permet de chargeer une table géoreferencée sous forme de couche;
    en utilisant deux champs ('X' et 'Y') le la table pour définir la longitude/Latitude des points et d'autres champs pour Info. le chargement de cette table va générer une couche constituée de points representants les tuples de la table.
    de plus sur certain type de connexions la liaison peut etre dynamique. de façon à ce qu'une modification de la valeur du champs 'X' ou 'Y' provoque le deplacement du point graphique correspondant. (mais c'est po pour ton cas)

    pour mieux t'expliquer (je sais que c'est un peut lourd ce que je viens de dire) je te propose la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function GenerateLayerFromDataset(DS:TCustomADODataSet; XField, YField:String; Map:TMap; LayerName:String):Layer;
    var
      Bnd:BindLayer;
    begin
      Bnd := CoBindLayer.Create;
      Bnd.LayerName := LayerName;
      Bnd.LayerType := miBindLayerTypeXY;
      Bnd.CoordSys:=Map1.NumericCoordSys;
      Bnd.RefColumn1 := XField; // XField : le nom du champ representant la coordoné X
      Bnd.RefColumn2 := YField; // Idem pour YField
      Map.Datasets.Add(miDataSetADO, DS.Recordset,'NomDuDS',XField,YField,Bnd,EmptyParam,EmptyParam);
     Result := Map.Layers.Item(LayerName);
    end;
    Réponse pour 1 et 2
    pour repondre au deux question (il sont un peut lié)
    fo avoir le pseudo code suivant :
    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
     
    var
      TmpLyr:Layer; // Pour le layer temporaire
      DataBasePointLyer:Layer; // Pour le layer contenant les poits de ta base de données
    ......
    ... suite de ton prog.
    ......
     
    function TForm1.InitialisationFenetreMapper;
      // pour initialiser 
    begin  
      .. créer le tool PLOT_VEHICLE_TOOL
      //
      // .. Charger les couches de la carte (Ville, Rues, Mosquées, Eglises....)
      //
      // Générer les deux couches {interessantes}
      TmpLyr:= GenerateTempLayer(MAP1, 'Couche Temporaire');
      DataBasePointLyer:= GenerateTempLayer(MAP1, 'Positions Vehicules');  
    end; 
     
    // Handler de l'evenement ToolUsed
    procedure TForm1.Map1ToolUsed(ASender: TObject; ToolNum: Smallint; X1, Y1, X2, Y2, Distance: Double; Shift, Ctrl: WordBool; var EnableDefault: WordBool); 
    begin
      Case ToolNum of
        PLOT_VEHICLE_TOOL:
          begin
            AddPoint(X1,Y1, Map1, TmpLyr);
            // ...
            // Le code pour inserer le point (X1, Y1) dans ta Table
          end;
      end;
    end;
    en résumé, tu doit avoir deux couche suplementaire en plus des couches qui constituent ta carte géo. une LayerDataset contenant les points déja saisies dans ta table, l'autre temporaire qui va contenir les nouveaux.

    pour l'autre question
    pourquoi il n'y a pas d'interactivité, c'est à dire si je selectionne un enregistrement ça ne selectionne pas un point sur la carte.
    c'est parce que "Mapx" ne travail pas dirrectement sur le dataset, il crée toujours une copie (sous forme d'un objet CMapXDataset) il pert ainsi toute liaison avec l'objet ensemble de données originel.
    tu est donc obligé d'effectuer toi même une recherche sur les "Features" du layer pour les séléctionné en utilisant la propriété Selection du layer en question.

    ouf, c'est fini pour aujourd'hui.
    ===============================================
    Faut savoir que c'est pas tout les jours que je rédige des réponses aussi détaillées, les prochaines fois essayes d'être plus précis dans tes questions.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 10
    Par défaut
    Chebreg je te remercie infiniment

    tu es un puits de connaissance, mes questions seront beaucoup plus concises à l'avenir, c'est vrai que là j'ai exprimé tout mon probleme,
    et il était trop gros je m'excuse

    comment as tu fais pour connaitre tout ça?
    en autodidacte, en formation ??

    Tres cordialement
    Laurent

  10. #10
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Par défaut
    Citation Envoyé par Laurent de marseille
    comment as tu fais pour connaitre tout ça?
    en autodidacte, en formation ??
    "MapX Online Help" y a pas mieux, une semaine deçu et tu sera expert. mais bon fo avoir une bonne connaissance en anglais (vu que ya pas une version Fr)

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 10
    Par défaut
    bonjour Chebreg

    je reviens à MapX apres une semaine à l'hopital (rien de tres grave)...

    pourrait tu, si tu as un peu de temps, m'envoyer un exemple simple qui fonctionne, sans images de fond.
    Juste 3 points dans une table access, reliés à une carte avec un bouton pour inserer un point dans la carte et dans la base(DBgrid).

    si tu ne peut pas, ce n'est pas grave, je comprend(j'exagère sans doute).
    Peu importe ta réponse, ça ne changera pas ma considération envers toi.
    (j'essaie juste de gagner du temps pour me faire remarquer dans ma boite)

    à bientot
    Laurent

Discussions similaires

  1. [ODBC] Access CRecordset AddNew
    Par samtheh dans le forum MFC
    Réponses: 4
    Dernier message: 20/06/2006, 11h50
  2. [ODBC] Mode exlusif ODBC Access
    Par Benat64 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/01/2006, 16h23
  3. [ODBC ACCESS]Formulaires
    Par Jean_Benoit dans le forum Administration
    Réponses: 4
    Dernier message: 16/01/2006, 13h25
  4. ODBC Access => Type Incompatible avec un champ DATE ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 6
    Dernier message: 23/04/2005, 02h02
  5. Réponses: 3
    Dernier message: 31/01/2005, 23h24

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