Je cherche un moyen efficace de regrouper les lignes indépendamment de leur direction. Cela signifie qu'une ligne entre New York et Los Angeles devrait être dans le même groupe qu'une ligne dans l'autre sens entre Los Angeles et New York. Les points de départ et d'arrivée devraient être similaires (c'est-à-dire que San Diego à Long Island devrait être dans le même groupe que LA-NY mais probablement pas San Francisco à Boston) et il n'y a pas de points intermédiaires. Les données d'entrée seraient similaires à cet exemple:
(Par Cassiopeia sweet sur Wikipedia japonais GFDL ou CC-BY-SA-3.0 , via Wikimedia Commons)
J'ai déjà essayé de trier les lignes à l'avance, par exemple pour les faire toutes courir d'ouest en est, mais cela ne résout pas le problème des lignes allant du nord au sud et inversement.
Connaissez-vous un algorithme traitant ce problème? J'ai cherché mais en plus de l' algorithme pour calculer la direction moyenne des segments non dirigés, je n'ai rien trouvé d'utile à distance, donc je dois utiliser les mauvais termes de recherche.
la source
Réponses:
Si je vous comprends bien, vous voulez regrouper les lignes qui sont à peu près les mêmes sans égard à la direction.
Voici une idée qui, je pense, pourrait fonctionner.
diviser les lignes en point de départ et point de fin
Regroupez les points et obtenez l'ID du cluster
Recherchez des lignes avec la même combinaison d'ID de cluster. Ce sont un cluster
Cela devrait être possible dans PostGIS (bien sûr :-)) version 2.3
Je n'ai pas testé la fonction ST_ClusterDBSCAN, mais elle devrait faire le travail.
Si vous avez un tableau de lignes comme celui-ci:
Et vous voulez créer le cluster où les points de départ et d'arrivée sont distants de 10 km maximum. Et il doit y avoir au moins 2 points pour être un cluster alors la requête pourrait être quelque chose comme:
En vous joignant à
a.cluster_id<b.cluster_id
vous obtenez un identifiant de cluster comparable indépendamment de la direction.la source
Voulez-vous vraiment regrouper uniquement par direction, sans aucune considération d'origine ou de destination? Si oui, il existe des moyens très simples. Le plus simple est peut-être de calculer le relèvement de chaque ligne, de le doubler et de le tracer comme un point sur un cercle. Étant donné que les roulements avant-arrière diffèrent de 180 degrés, ils diffèrent de 360 degrés après avoir doublé et tracent donc exactement au même endroit. Maintenant, regroupez les points dans le plan en utilisant la méthode que vous aimez.
Voici un exemple de travail dans
R
, avec sa sortie montrant les lignes colorées selon chacun des quatre groupes. Bien sûr, vous utiliseriez probablement un SIG pour calculer les roulements - j'ai utilisé les roulements euclidiens pour plus de simplicité.la source
Votre clarification de la question indique que vous souhaitez que le clustering soit basé sur les segments de ligne réels , dans le sens où deux paires origine-destination (OD) doivent être considérées comme "proches" lorsque les deux origines sont proches et les deux destinations sont proches , quel que soit le point considéré comme origine ou destination .
Cette formulation suggère que vous avez déjà une idée de la distance d entre deux points: il peut s'agir de la distance lorsque l'avion vole, de la distance sur la carte, du temps de trajet aller-retour ou de toute autre métrique qui ne change pas lorsque O et D sont commuté. La seule complication est que les segments n'ont pas de représentations uniques: ils correspondent à des paires non ordonnées {O, D} mais doivent être représentés comme des paires ordonnées , soit (O, D) ou (D, O). Nous pourrions donc prendre la distance entre deux paires ordonnées (O1, D1) et (O2, D2) pour être une combinaison symétrique des distances d (O1, O2) et d (D1, D2), telles que leur somme ou le carré racine de la somme de leurs carrés. Écrivons cette combinaison comme
Définissez simplement la distance entre les paires non ordonnées comme étant la plus petite des deux distances possibles:
À ce stade, vous pouvez appliquer n'importe quelle technique de clustering basée sur une matrice de distance.
À titre d'exemple, j'ai calculé les 190 distances point à point sur la carte pour 20 des villes américaines les plus peuplées et j'ai demandé huit grappes à l'aide d'une méthode hiérarchique. (Par souci de simplicité, j'ai utilisé des calculs de distance euclidienne et appliqué les méthodes par défaut dans le logiciel que j'utilisais: en pratique, vous voudrez choisir les distances et les méthodes de regroupement appropriées à votre problème). Voici la solution, avec des clusters indiqués par la couleur de chaque segment de ligne. (Les couleurs ont été assignées au hasard aux grappes.)
Voici le
R
code qui a produit cet exemple. Son entrée est un fichier texte avec les champs "Longitude" et "Latitude" pour les villes. (Pour étiqueter les villes sur la figure, il comprend également un champ "Clé".)la source