Faire une polyligne en une partie à partir d'une polyligne en plusieurs parties?

11

J'ai une polyligne divisée en plusieurs parties et ces parties ne sont pas bien ordonnées de sorte que l'ID du sommet ne suit pas le tracé de la polyligne.

Cette polyligne représente une ligne de bus et j'ai besoin d'avoir le tracé suivant le chemin de conduite du bus. Je voudrais savoir comment fusionner les multiparts de cette polyligne?

J'ai déjà essayé de diviser et de séparer, ainsi que le multipartie en une seule partie, l'union, la fusion, etc. mais personne ne me donne le résultat que je veux.

bmoussea
la source
@bmoussea, avez-vous utilisé l'outil Dissoudre?
artwork21
@ artwork21 Oui je l'ai fait, mais cela ne change rien: la polyligne est toujours divisée en plusieurs
parties
Vérifiez la géométrie vérifiez que la pièce multiple est commandée correctement en premier help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… puis dissolvez une oeuvre21 mentions
Mapperz
J'ai vérifié la géométrie et aucun problème n'a été signalé. Les parties multiples n'apparaissent pas dans la géométrie de contrôle car elles font déjà partie de la polyligne.
bmoussea
Les parties multiples de ma polyligne apparaissent lors de l'édition du calque où se trouve ma polyligne, puis faites un clic droit dessus -> Modifier les sommets et regardez dans les propriétés d'esquisse. Voici les différentes parties (multiparts) de ma polyligne que je voudrais fusionner.
bmoussea

Réponses:

5

Je constate à partir de vos balises que vous exécutez ArcGIS 10. J'ai utilisé la méthode suivante pour une tâche similaire:

1) Utiliser le multipartie pour une seule pièce

2) Utilisez Unsplit

Pour que cela fonctionne (c'est-à-dire pour que les lignes soient dans le bon ordre), vous devrez peut-être couper la ligne en points de terminaison constitutifs, puis changer la direction en fonction d'un attribut (par exemple, 1 = début, 2 = fin) - vous pouvez l'utiliser pour relier conditionnellement uniquement les points différents (si 1 + 2, créez des lignes de connexion).

Si vous travaillez avec un IDE, le code pour le faire est assez long, mais je ferai de mon mieux pour vous aider si vous avez des questions spécifiques.

Radar
la source
1
"Unsplit Line" nécessite une licence ArcInfo. Si vous n'avez pas ce niveau de licence, utilisez "Dissolve", il a une option Unsplit Line.
klewis
1

J'ai dû faire exactement la même chose il y a longtemps en utilisant AV 3.x et Avenue. J'ai jeté un coup d'œil au code mais je ne l'ai pas trouvé. Si je me souviens bien, la logique a ressemblé à ceci: (j'avais également les arrêts de bus et les terminaux comme un fichier de formes de points différent, donc j'ai pu déterminer les parties de début et de fin):

  1. Créez une polyligne vide pour recevoir les pièces triées. Appelons cela la «polyligne triée»
  2. Pour obtenir la première partie:

    2a. Obtenez la partie la plus proche du terminal de démarrage

    2b. Obtenez les distances du nœud de début et de fin de cette partie au terminal de départ. Si le sommet de départ est le plus proche, ajoutez cette partie à la «polyligne triée». Si c'est la fin, retournez-le puis ajoutez-le.

  3. Pour obtenir les parties centrale et finale, commencez par la partie (polyligne) que vous avez créée à l'étape précédente et dans une boucle while (true), commencez à comparer la distance entre le nœud d'extrémité de la première partie aux autres parties de l'entrée polyligne. Celui qui est le plus proche est la «partie suivante». Comparez la distance du nœud de début et de fin de la pièce suivante pour déterminer s'il faut la retourner ou non avant de l'ajouter à la «polyligne triée»
  4. Quittez la boucle lorsque le nombre de pièces dans la «polyligne triée» est le même que dans la polyligne d'entrée.

... ou quelque chose comme ça! :-)

Faites-moi savoir si cela a du sens pour vous et je peux essayer de retrouver mon code Avenue original.

mapoholic
la source
1

J'ai travaillé dans un projet quelque chose de similaire, j'ai utilisé ArcObjects. Mon objectif était de connecter deux polylignes adjacentes si l'un de ses points d'extrémité est le point de départ d'un autre pour créer deux polylignes courtes en une seule polyligne. Mon processus était:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey est une classe qui contient un point.
  • FeatureDataList est une classe qui contient la liste des IFeatures.
  • Les deux classes remplacent les méthodes "Equals" et "GetHashCode".

    Dictionary<PointKey, FeatureDataList> ToPointDictionary;
    Dictionary<PointKey, FeatureDataList> FromPointDictionary;
    public void CreateDictionary(IFeatureLayer featureLayer)
    {
        var featureFunctionality = new FeatureFunctionality();
        List<IFeature> features = GetAllFeatures(featureLayer.FeatureClass);
    
        foreach (var feature in features)
        {
            IPolyline polyline = GetPolylineFromFeature(feature);
            AddFeatureInDictionary(ToPointDictionary, feature, polyline.ToPoint);
            AddFeatureInDictionary(FromPointDictionary, feature, polyline.FromPoint);
        }
    }
    
    
    
    void AddFeatureInDictionary(Dictionary<PointKey, FeatureDataList> polylineDictionary, IFeature feature, IPoint point)
    {
        FeatureDataList featureDataList;
        PointKey key = PointKey.GetKey(point);
        if (!polylineDictionary.ContainsKey(key))
        {
            featureDataList = new FeatureDataList();
            featureDataList.Add(feature);
            polylineDictionary.Add(key, featureDataList);
        }
        else
        {
            featureDataList = polylineDictionary[key];
            featureDataList.Add(feature);
        }
    }
    

Par ces processus, j'ai créé deux dictionnaires. Après avoir créé des dictionnaires, je vérifie si les deux dictionnaires contiennent le même point et dans les deux dictionnaires, cette clé n'a qu'une seule fonctionnalité dans la liste des fonctionnalités, puis j'ai créé une nouvelle polyligne avec ces deux polylignes et supprimer deux polylignes courtes.

Pour joindre deux polylignes en une seule:

   private IPolyline GetJoinedPolylineFromFeatures(List<IFeature> features)
   {
        IPolyline newPolyline = null;
        if (features.Count == 2)
        {
            IPolyline polyline1 = feature1.Shape as IPolyline;
            IPolyline polyline2 = feature2.Shape as IPolyline;
            if (PointKey.GetKey(polyline1.ToPoint).Equals(PointKey.GetKey(polyline2.FromPoint)))
            {
                var topoOperator2 = polyline1 as ITopologicalOperator2;
                if (topoOperator2 != null)
                    newPolyline = topoOperator2.Union(polyline2) as IPolyline;
            }
            else if (PointKey.GetKey(polyline1.FromPoint).Equals(PointKey.GetKey(polyline2.ToPoint)))
            {
                var topoOperator2 = polyline2 as ITopologicalOperator2;
                if (topoOperator2 != null)
                    newPolyline = topoOperator2.Union(polyline1) as IPolyline;
            }
        }
        return newPolyline;
  }
Emi
la source
1

J'ai eu exactement le même problème en raison des mises à jour que j'ai apportées aux itinéraires de bus à l'aide de l'outil "Reshape Feature". Dissolve, Merge et Unsplit ne fonctionnaient pas car les fonctionnalités en plusieurs parties n'étaient pas coïncidentes.

Si vous ne l'avez pas encore remarqué, examinez de plus près les sommets qui doivent coïncider entre vos entités en plusieurs parties. Prolongez, ajustez ou remodelez si nécessaire, puis utilisez l'un des outils indiqués ci-dessus.

Abraham L
la source
Oh, et au fait: par "regarder de plus près", je veux dire TRÈS TRÈS PROCHE.
Abraham L
1
J'ai eu le même problème et j'ai regardé de beaucoup plus près les sommets d'extrémité de pièce comme le suggère Abraham. Ils n'étaient en fait pas connectés. Activez l'accrochage aux points d'extrémité et accrochez les sommets d'extrémité ensemble, problème résolu .. pour moi anyhoo.