Suite

Diviser la couche de polylignes en clusters avec des exigences spécifiques dans ArcGIS for Desktop ?

Diviser la couche de polylignes en clusters avec des exigences spécifiques dans ArcGIS for Desktop ?


Pour mon travail dans ArcGIS 10.2 for Desktop, je dois diviser les couches de lignes en clusters/groupes. Actuellement, je le fais manuellement, mais j'aime automatiser cela. Les couches de lignes peuvent être constituées de 50 à 2500 segments (lignes plus petites). Ce que je dois faire, c'est que le calque de ligne soit divisé en un m de grappes (où m peut être réglé par l'utilisateur) qui répondent aux exigences suivantes. Par ordre d'importance:

  1. La première exigence est qu'un cluster doit toujours être composé de 8 segments ou plus.
  2. La seconde est que les segments doivent être proches les uns des autres.
  3. La troisième est que les clusters doivent avoir un m de segments.

Donc, pour expliquer un peu plus cet ordre d'importance, j'ai des exemples avec des images :

Premier exemple d'une couche de lignes à diviser en 24 clusters avec une moyenne de 20 segments par cluster. La flèche rouge fait partie de la couche de lignes qui se compose de 4 segments. Cela devrait donc former 1 cluster avec plusieurs segments de la partie avec la flèche verte, de sorte qu'il y ait au moins 8 segments, mais de préférence 20 segments.

Deuxième exemple. Dans le cas où toute la couche de lignes est constituée de 60 segments à diviser en 3 couches, la situation idéale serait de 3 groupes avec chacun 20 segments connectés les uns aux autres. Mais s'il y a une partie isolée de la couche de lignes qui se compose de 10 segments (1) cela devrait être 1 cluster et l'autre partie qui se compose de 50 segments devrait être divisée en 2 clusters (2 & 3) de 25 segments (voir photo )

J'ai essayé d'accomplir cette tâche en examinant certains outils arcgis mais je n'ai pas encore trouvé de solution. Par exemple l'outil d'analyse de regroupement, mais jusqu'à présent je n'étais pas capable de le personnaliser suffisamment pour répondre à mes besoins. J'ai aussi trouvé ce post qui est un peu ce que je recherche mais pas complètement : diviser les polygones en nombre égal de groupes. Mais pour autant que je sache, cela ne répond pas complètement à mes exigences, en particulier l'ordre d'importance. De ce fait, la solution de FelixIP est difficile à comprendre pour moi et je ne suis donc pas en mesure de juger si je peux l'utiliser.

Donc, à ce stade, il me semble que mon problème est un problème mathématique difficile à résoudre, en particulier avec les outils standard d'Arc. Mais peut-être que quelqu'un a de bonnes idées/méthodes (peut-être avec un script python personnalisé) pour accomplir cette tâche ou au moins peut-il me mettre sur la bonne voie ?


J'ai posté plusieurs fois sur ce Q, par exemple ici. Il semble que j'ai mal expliqué le fonctionnement de ma méthode de regroupement, car de nombreux utilisateurs ont du mal à la comprendre. Ceci est une autre tentative basée sur le plus basique de tous les exemples que je puisse trouver.

Mettons 6 points en ligne droite :

et essayer de créer 3 groupes avec un nombre égal de membres dans chacun.

Pour ce faire, nous allons parcourir toutes les combinaisons de nœuds par deux, par exemple (0,1), (0,2), (0,3)… (3,4),(3,5),(4,5 ). Pour chaque combinaison, nous testerons les nœuds/candidats restants et supposerons que le candidat appartient au 1er groupe de nœuds si sa distance au 1er nœud en combinaison est moins qu'au 2ème nœud en combinaison. Sinon, ce candidat appartient au groupe du 2e nœud. Nous cassons lorsque le 2e (grand) groupe est deux fois plus grand que le 1er (petit) groupe, c'est-à-dire

RATIO de la taille des groupes = 3-1 = 2.

Notre 1er (petit) groupe deviendra notre 1er cluster.

Le tableau ci-dessous montre les résultats des itérations

Comme on peut le voir, nous avons atteint la solution (RATIO de 2nd/1st = 2) à l'étape 13 et les nœuds [3,2] sont notre premier cluster.

Nous recommençons à parcourir les nœuds restants [4,5,0,1] cette fois en essayant d'atteindre RATIO=2-1=1. Lorsque RATIO de 1 est atteint, nous obtiendrons le cluster n ° 2. Le reste est le cluster n ° 3.

Veuillez noter que si nous étions moins catégoriques et que nous calculions simplement le rapport des tailles de groupe grand/petit, nous obtiendrions une solution à la 2ème itération avec le 1er cluster=[2,3].

Ainsi, la seule chose nécessaire pour implémenter cette méthode est la capacité de calculer la distance la plus courte entre 2 nœuds A et B. De plus, il n'est même pas nécessaire de calculer la distance réelle, il suffit de la définir égale à 1 entre tous les voisins immédiats, ainsi, la longueur du trajet deviendra égale au nombre de liens passés lors du trajet de A à B. Il existe de nombreux algorithmes les plus courts disponibles en tant que fonctions Python distinctes. Je préfère utiliser networkx simplement parce que cela raccourcit le code. Toute géométrie (points, polylignes et polygones) peut représenter nœuds.

La seule chose requise est la définition des voisins et dans toute jointure spatiale SIG décente (nœuds à lui-même) avec une option à plusieurs le fait, c'est-à-dire crée une paire de voisins connectés. Les enregistrements de cette table sont liens.

Je pense que la méthode expliquée ci-dessus peut être facilement adaptée pour résoudre la question dans OP. Il n'y a qu'une étape à ajouter - combiner les segments d'intersection et traiter chaque cluster individuellement, par ex. définir le nombre de sous-groupes par

N=int(total_segment_count_in_cluster/20)

Si un cluster individuel contient << 20 segments, laissez-le pour une analyse plus approfondie, avec un type différent de relation de jointure spatiale (à la distance de).