#1 Sun 12 November 2006 21:15
- Roch
- Participant occasionnel
- Date d'inscription: 3 Mar 2006
- Messages: 17
MapInfo-jointure de table
J'ai un probleme de jointure de table dans MapInfo 8. Je ne sais pas comment m'y prendre.
J'ai deux tables une de rue avec les valeurs id_rue; Debut_trocnconGauche; Fin_TronconGauche, Debut_TronconDroit, Fin_TronconDroit. Dans la deuxieme table, j'ai une colonne des numero_civique des batiments.
Comment faire une jointure des deux tables dans MapInfo 8, de maniere que chaque numero civique (parfois paire, parfois impaire) appartient a un intervalle de troncon qui contient la valeur du numero civique
Merci de m'aider
Hors ligne
#2 Mon 13 November 2006 00:25
- Damien BEAUSEIGNEUR
- Participant assidu
- Lieu: meyzieu
- Date d'inscription: 5 Sep 2005
- Messages: 425
Re: MapInfo-jointure de table
Une petite idée pour déterminer le bon côté, un seul défaut dans le cas de route numéroté que d'un seul côté.
On prendra pour différentier les 2 tables Rt pour la table route et Bat pour la table contenant les batiments
(Mod (Rt.Debut_tronconGauche,2) = Mod (Bat.numero_civique,2) and
Rt.Debut_tronconGauche >= Bat.numero_civique and
Rt.Fin_TronconGauche <= Bat.numero_civique)
OR
(Mod (Rt.Debut_tronconDroit,2) = Mod (Bat.numero_civique,2) and
Rt.Debut_tronconDroit >= Bat.numero_civique and
Rt.Fin_TronconDroit <= Bat.numero_civique)
Une petite explication
Mod (Rt.Debut_tronconGauche,2) permet d'obtenir l'information paire 0 ou impaire 1
Pour le début du tronçon côté gauche.
On procède de la même façon pour le numéro de batiment.
Si jamais c'est le côté droit deuxième partie du code, l'interogation reste nécessaire pour la recherche des limites des numéros de rues sachant que dans un tronçon il peut y avoir de gros décalage.
Pour gérer le cas de numérotation d'un seul côté de la rue, cas des quais, par exemple.
Il faut rajouter un champ indiquant l'unicité du côté par exemple UC avec 1 pour un seul côté.
OR
(UC=1 and
((Rt.Debut_tronconGauche >= Bat.numero_civique and
Rt.Fin_TronconGauche <= Bat.numero_civique) or
(Rt.Debut_tronconDroit >= Bat.numero_civique and
Rt.Fin_TronconDroit <= Bat.numero_civique))
Hors ligne
#3 Mon 13 November 2006 03:57
- Roch
- Participant occasionnel
- Date d'inscription: 3 Mar 2006
- Messages: 17
Re: MapInfo-jointure de table
Merci Damien de ton precieux concours. seulement que dans le code que tu me proposes, il semble y avoir un probleme de syntaxe que je n'identifie pas :-( en adaptant le code dans la fenetre SQL de MapInfo, il met comme message des erreurs de syntaxe!!!!!!
:-(
Hors ligne
#4 Mon 13 November 2006 10:03
- jean-francois Behm
- Participant assidu
- Lieu: Toulouse
- Date d'inscription: 5 Sep 2005
- Messages: 212
- Site web
Re: MapInfo-jointure de table
En faisant un géocodage de la table des bâtiments, des ponctuels positionnés à une certaine distance du tronçon (définissable dans les options) concerné vont être créés. En faisant une zone tampon de cette distance (par exemple 1 cm) autour des ponctuels créés, une jointure spatiale (les objets tampons_bâtiments qui intersectent les objets tronçons) pourra être appliquée.
Cela peut peut-être répondre à votre question ?
Hors ligne
#5 Mon 13 November 2006 20:19
- Damien BEAUSEIGNEUR
- Participant assidu
- Lieu: meyzieu
- Date d'inscription: 5 Sep 2005
- Messages: 425
Re: MapInfo-jointure de table
Celà marche à condition d'utiliser les mêmes sources de données pour le géocodage que le linéaire sinon l'on risque d'avoir deux tronçon pour le même immeuble.
Sinon transfère nous le code, on pourra peut être voir où est l'erreur .
Hors ligne
#6 Tue 14 November 2006 04:10
- Roch
- Participant occasionnel
- Date d'inscription: 3 Mar 2006
- Messages: 17
Re: MapInfo-jointure de table
La methode de geocodage pourrait etre moins efficace vu que le seuil de tolerance pourait etre aleatoire,; de plus un batiment qui se trouve "visuellement" a cheval sur deux troncons sera difficilement associable a l'un ou a l'autre troncon.
Voici le code que j'excecute
"Rt.nom_rue=Bt.NOM_RUE and (Mod (Rt.Debut_tronconGauche,2) = Mod (Bat.numero_civique,2) and
Rt.Debut_tronconGauche >= Bat.numero_civique and
Rt.Fin_TronconGauche <= Bat.numero_civique)
OR
(Mod (Rt.Debut_tronconDroit,2) = Mod (Bat.numero_civique,2) and
Rt.Debut_tronconDroit >= Bat.numero_civique and
Rt.Fin_TronconDroit <= Bat.numero_civique)"
Deux observations:
- je ne retouve pas la fonction Mod dans MapInfo
- si je ne met pas tout le code dans des " ", cela ne s'execute pas.
Dans le cas ou le code s'execute (avec des "") je remarque par exemple que deux batiments qui doivent normalement appartenir a un meme troncon appartiennent a des troncons differents
:-(
Hors ligne
#7 Tue 14 November 2006 10:22
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: MapInfo-jointure de table
Beaucoup de fonction ne sont pas immédiatement accessible depuis MI
Il faut passer par le manuel MapBasic pour les "découvrir" !!
Le coup des guillemets m'étonne: normalement le contenu est alors vu comme une chaine de caractère ...et donc là pas du tout pris en compte!!
nb: il manque une parenthèse au tout début du code
Hors ligne
#8 Tue 14 November 2006 13:08
Re: MapInfo-jointure de table
Mod n'est pas une fonction MapBasic. Il fait partie des "opérateurs numériques" dont le sens est défini dans l'annexe B Sommaire des opérateurs du Gudie MapBasic:
Mod = reste de la division en entiers de a par b (a Mod b)
Hors ligne
#9 Tue 14 November 2006 20:29
- Damien BEAUSEIGNEUR
- Participant assidu
- Lieu: meyzieu
- Date d'inscription: 5 Sep 2005
- Messages: 425
Re: MapInfo-jointure de table
Mea culpa alors.
C'était effectivement le but récupérer le reste de la division par 2, pour obtenir la parité.
Celà explique l'erreur de syntaxe.
Pour ce qui est du nombre de parenthèses, le compte est bon.
Il est par contre préférable pour l'utilisation de mod d'utiliser des parenthèses pour la comparaison, pour éviter les problème de test.
Hors ligne
#10 Tue 14 November 2006 20:38
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: MapInfo-jointure de table
Damien,
Mon dernier post répondait au précédent, celui de Roch, pas au tien.
C'est sa syntaxe avec guillemets (et sans la parenthèse de départ) que j'évoquais...
et Mod est bien un opérateur, utilisable tant avec MB qu'avec MI (même s'il n'y est pas renseigné)
Hors ligne
#11 Wed 15 November 2006 02:51
- Roch
- Participant occasionnel
- Date d'inscription: 3 Mar 2006
- Messages: 17
Re: MapInfo-jointure de table
J'ai trouvé une solution "secours" que je pense adopter en attendant une plus meilleure.
En effet, je pense cinder la table des rues en 4 sous tables: TronconGauche_Paire, TronconGauche_impaire, TronconDroit_paire. Troncondroit_impaire; ensuite je cinderai la table des batiemnts en deux sous tables: BatPaire, BatImpaire
A paire des sous tables de batiment, j'excuterai des requetes sur les 4 sous tables troncons suivant que les valeurs des sous tables batiments soient paires ou impaires
Enfin j'envisage assembler toute les TableRequetes pour reconstituer la table original des troncons.
Je reconnais que la methode parait tres long, mais ca me permettrait peut etre d'avancer en attendant une solution plus simple et plus eficace
Je vous remercie tous de vos precieuses contributions
Hors ligne
#12 Wed 15 November 2006 21:12
- Damien BEAUSEIGNEUR
- Participant assidu
- Lieu: meyzieu
- Date d'inscription: 5 Sep 2005
- Messages: 425
Re: MapInfo-jointure de table
En fait pour ta sélection il existe une erreur de logique et pour reprendre Maurice, il manquait un groupe de parenthèses pour arriver à la sélection correcte.
Pour faire simple je vais réécrire la sélection.
Code:
Rt.nom_rue=Bt.NOM_RUE and ( ( (Rt.Debut_tronconGauche mod 2) = (Bat.numero_civique mod 2) and Rt.Debut_tronconGauche >= Bat.numero_civique and Rt.Fin_TronconGauche <= Bat.numero_civique ) OR ( (Rt.Debut_tronconDroit mod 2) = (Bat.numero_civique mod 2) and Rt.Debut_tronconDroit >= Bat.numero_civique and Rt.Fin_TronconDroit <= Bat.numero_civique ) )
Code:
Rt.nom_rue=Bt.NOM_RUE And
première ligne, la condition obligatoire d'ou le AND
Code:
( ( (Rt.Debut_tronconGauche mod 2) = (Bat.numero_civique mod 2) and
Il faut l'égalité des parités pour établir la jointure, ici nous prenons le cas gauche
l'opérateur mod permet d'obtenir le reste de la division entière et par conséquent le résultat aura pour valeur soit 0 (pair) soit 1 (impair).
Donc si les valeurs sont respectées on peut tester les bornes du côté gauches, d'ou le and.
Les parenthèses ouvrantes nous avons besoin de trier les questions.
La première l'appartenance au tronçon
la deuxième l'appartenance au tronçon du côté gauche
Sachant que le plus grand tri proviens du nom de la rue.
Note l'on suppose ici que l'ordre des numéros dans le tronçon est croissant entre début et fin.
De même que l'on suppose qu'il n'existe pas de rue numérotée d'un seul côté.
Si celà peut être utile
Cordialement
Hors ligne