#1 Mon 23 October 2017 22:08
- tta
- Participant occasionnel
- Lieu: Montréal
- Date d'inscription: 4 Oct 2005
- Messages: 39
Fonction géométrique basée sur la forme de l'objet
Bonjour,
J'aimerai savoir s'il existe une fonction dans MapInfo permettant de déterminer un objet géométrique linéaire par sa forme. Je m'explique: je dispose d'une table de tronçons de rues. On me demande d'extraire de cette table MapInfo tous les cul-de-sac et rond-points. À défaut d'avoir cette information codifiée dans la table, je me demandais si on peut se baser une la forme géométrique pour effectuer cette opération. Si oui quelle sera cette fonction dans MapInfo?
Merci!
Hors ligne
#2 Tue 24 October 2017 23:36
- CRIGBAB
- Participant assidu
- Lieu: Bayonne
- Date d'inscription: 14 Nov 2005
- Messages: 180
Re: Fonction géométrique basée sur la forme de l'objet
Bonsoir,
Pour savoir si un tronçon est en cul de sac une de ses extrémités est connectée à aucun autre tronçon que lui même.
Une méthode un peu simpliste consisterait à créer une table des noeuds extrémités des tronçons puis de rechercher les noeuds qui n'intersectent qu'un tronçon.
Pour créer cette table il faut d'abord s'assurer que tous les tronçons sont des polylignes avec une seule section (composé d'un élément continu), pour simplifier le traitement
il faut copier la table des tronçons en deux tables et ouvrir ces deux tables
Exemple
si ma table des troncons s'appellent : 'test_20171024_tr'
je l'enregistre sous 'test_20171024_nd_deb' et 'test_20171024_nd_fin'
j'ouvre ces deux tables
et je lance dans la fenetre Mapbasic la commande suivante
update test_20171024_nd_deb set obj=createpoint(objectnodeX(obj,1,1),objectnodeY(obj,1,1))
update test_20171024_nd_fin set obj=createpoint(objectnodeX(obj,1,objectinfo(obj,20)),objectnodeY(obj,1,objectinfo(obj,20)))
ces deux commandes transforment mes polylignes en nds (par la suite ces tables nd seront appelées nd_deb et nd_fin pour aller plus vite de le texte.
j'enregistre les deux tables et je peux rechercher par jointure spatiale le nombre de troncons que chaque noeud intersecte
Pour cela il faut utiliser bêtement la commande mettre à jour colonne avec nd_deb et tr (jointure par intersecte choisir l'ajout d'une colonne temporaire et faire un count comme valeur et afficher le résultat pour nd_deb et nd_fin.
Les occurrences pour la nouvelle colonne avec 1 comme valeur indique les nœuds qui sont raccordés qu'à un seul tronçon
Pour identifer les troncons il vaut mieux que chacun est un identifiant unique que vous retrouvez aussi sur les tables nd_deb et nd_fin car c'est la copie des troncons. Une simple requête comme celle-ci
Select * from test_20171024_tr where code_insee in (select code_insee from test_20171024_nd_deb where int(col3)=1) into sel1
le champ code_insee est mon identifiant et c'est dans la colonne 3 (col3) que le nombre de troncons raccordés est enregistré.
Il faut faire la même requête avec nb_fin
J'espère avoir été assez clair pour ce cas là en utilisant que des fonctions très basiques de Mapinfo. Pour allez plus loin il est souhaitable d'utiliser Mapbasic pour automatiser le processus. Mais déjà en copiant les lignes de commandes dans un fichier texte et avec le bon entête on peut faire un wor qui automatise le tout.
Pour les rond-points et giratoires c'est bien plus compliqué car cela dépend comment ils sont dessinés.
Restant à votre disposition si nécessaire.
Cordialement.
Dernière modification par CRIGBAB (Tue 24 October 2017 23:40)
Hors ligne
#3 Thu 26 October 2017 03:10
- tta
- Participant occasionnel
- Lieu: Montréal
- Date d'inscription: 4 Oct 2005
- Messages: 39
Re: Fonction géométrique basée sur la forme de l'objet
Bonsoir CRIGBAB,
Merci pour votre suggestion à la résolution de mon problème. J'ai essayé de tester aujourd'hui votre solution au travail, malheureusement j'ai eu message d'erreur de de la fonction objectinfo. J'essaie de tester la solution chez moi avec ma version MapInfo 12. Les premières étapes semblent bien fonctionner. Je teste la solution jusqu'au bout et je vous reviens là-dessus.
Bonne soirée!
Cordialement.
Hors ligne
#4 Tue 31 October 2017 22:37
- CRIGBAB
- Participant assidu
- Lieu: Bayonne
- Date d'inscription: 14 Nov 2005
- Messages: 180
Re: Fonction géométrique basée sur la forme de l'objet
Bonsoir/Bonjour,
Avez vous réussi à traiter vos cul-de-sac?
La difficulté des objectnodeX (Y,...) provient du fait que si un objet est une multiligne, avec plusieurs segments, il faut d'abord récupérer le nombre de segments et le nombre de points pour le dernier segment. Stocker ces informations permettrait peut-être de faire la manipulation avec un simple wor, sans programme MApbasic, à voir donc.
Cordialement.
Hors ligne
#5 Fri 03 November 2017 21:10
- tta
- Participant occasionnel
- Lieu: Montréal
- Date d'inscription: 4 Oct 2005
- Messages: 39
Re: Fonction géométrique basée sur la forme de l'objet
Bonjour CRIGBAB,
Merci pour le suivi!
Désolé de répondre avec du retard à votre feed-back au sujet de ma question pour l'extraction des segments formant des cul-de-sac...En fait, ma version MapInfo au bureau avait des problèmes Le technicien vient de passer et de finaliser l'installation.
J'ai testé la procédure jusqu'à la fin et à ma grande surprise les occurences pour les noeuds ayant la valeur 1 pour dans les deux cas nd_deb et nd_fin avec tous les deux 2 occurences pour la valeur 1. Pourtant lmes culs-de-sac sont formés pour la majorité des cas avec 1 seul segment...
Je t'enverrai un jeu de données échantillons avec des noeuds pour test.
Cordialement.
Hors ligne