banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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 ?


Jean-François Behm
SERVICES GEOGRAPHIQUES
Centres de formation SIG - http://servicesgeographiques.com

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" !! sad
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

jakesp
Membre
Lieu: Montreal, QC
Date d'inscription: 28 Sep 2005
Messages: 126
Site web

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

 

Pied de page des forums

Powered by FluxBB