Зробити одну частину полілінією з багаточастинної полілінії?


11

У мене є полілінія, яка розділена на кілька частин, і ці частини не впорядковані так, що ідентифікація вершини не слідкує за графіком полілінії.

Ця полілінія є репрезентативною автобусною лінією, і мені потрібно провести графік, керуючись рухом автобуса. Мені хотілося б знати, як об’єднати багаточастинки цієї полілінії?

Я вже спробував розділити і роз'єднати, а також багаточастинки до єдиної частини, з'єднання, злиття тощо, але ніхто не дає мені результату, якого я хочу.


@bmoussea, ти використовував інструмент Dissolve?
твір21

@ artwork21 Так, але я нічого не змінив: полілінія все ще поділена на багаточастинки ...
bmoussea

Перевірте геометрію, переконайтеся, що багатозначна частина впорядкована правильно спочатку help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…, а потім розірвіть художній твір21 згадується
Mapperz

Я перевірив геометрію, і про проблеми немає. Багаточастинки не відображаються в контрольній геометрії, оскільки вони вже є частинами полілінії.
bmoussea

Багаточастинки моєї полілінії з’являються під час редагування шару, на якому знаходиться моя полілінія, а потім клацніть правою кнопкою миші -> Редагувати вершини та подивіться у Властивості ескізу. Ось різні частини (багаточастинки) моєї полілінії, яку я хотів би об'єднати.
bmoussea

Відповіді:


5

З ваших тегів я бачу, що ви працюєте з ArcGIS 10. Я використовував такий метод для подібного завдання:

1) Використовуйте багаточастинні до однієї частини

2) Використовуйте Розблокувати

Для того, щоб це працювало (тобто для того, щоб у вас були рядки у належному порядку), можливо, вам доведеться розбити рядок на складові кінцеві точки, а потім змінити напрямок на основі атрибута (наприклад, 1 = початок, 2 = кінець) - Ви можете використовувати це для умовного з'єднання лише тих точок, які відрізняються (Якщо 1 + 2, то створити сполучні лінії).

Якщо ви працюєте з IDE, код для цього досить тривалий, але я зроблю все можливе, щоб допомогти, якщо у вас є конкретні питання.


1
"Нерозділена лінія" вимагає ліцензії ArcInfo. Якщо у вас немає цього рівня ліцензії, тоді використовуйте "Розв’язати", у нього є опція "Нерозділена лінія".
klewis

1

Мені довелося зробити те саме, який час назад, використовуючи AV 3.x і Avenue. Я швидко шукав код, але не зміг його знайти. Якщо я добре пам’ятаю, логіка вийшла приблизно так: (У мене також були зупинки та термінали як інший файл форми, щоб я міг визначити початкову та кінцеву частини):

  1. Створіть порожню полілінію для отримання відсортованих деталей. Давайте назвемо це "відсортованою полілінією"
  2. Щоб отримати першу частину:

    2а. Отримайте частину, яка найближча до запуску терміналу

    2б. Отримайте відстані від початкового та кінцевого вузла цієї частини до стартового терміналу. Якщо вершина початку є найближчою, додайте цю частину до "відсортованої полілінії". Якщо його кінець - ФЛІПЛИТИ його, а потім додайте його.

  3. Щоб отримати середню та кінцеву частини, почніть з тієї частини (полілінії), яку ви створили на попередньому кроці, і протягом певного часу (справжнього) циклу, починайте порівнювати відстань між кінцевим вузлом першої частини та іншими частинами на вході поліліній. Найближча - «наступна частина». Порівняйте відстань початкового та кінцевого вузла наступної частини, щоб визначити, перевернути його чи ні перед тим, як додати його до 'відсортованої полілінії'
  4. Вийдіть з циклу, коли кількість частин у "відсортованій полілінії" така сама, як у вхідній полілінії.

... чи щось подібне! :-)

Дайте мені знати, чи це має сенс для вас, і я можу інший піти, щоб знайти свій оригінальний код Avenue.


1

Я працював у проекті щось подібне до цього, я використовував ArcObjects. Моєю метою було з'єднання двох сусідніх поліліній, якщо одна з його кінцевих точок є іншою вихідною точкою, щоб зробити дві короткі полілінії в одну полілінію. Мій процес:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey - клас, який містить крапку.
  • FeatureDataList - клас, що містить Список IFeatures.
  • Обидва класи переосмислюють методи "Рівно" та "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);
        }
    }
    

Цими процесами я склав два словники. Створюючи словники, я перевіряю, чи обидва словники містять однакову точку і в обох словниках, що цей ключ має лише одну особливість у списку функцій, тоді я створив нову полілінію з цими двома полілініями та видаляю дві короткі полілінії.

Щоб з'єднати дві полілінії в одну:

   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;
  }

1

У мене виникла точно така ж проблема через оновлення, які я робив для маршрутних автобусів за допомогою інструменту "Переформатувати функцію". Dissolve, Merge та Unsplit не працювали, тому що багаточастинні функції не збігалися.

Якщо ви цього ще не помічали, уважно подивіться на вершини, які повинні збігатися між вашими багаточастинними ознаками. Розширити, обрізати або змінити форму за необхідності, а потім використовувати будь-який із зазначених вище інструментів.


О, і до речі: Під "ближнішим поглядом" я маю на увазі ДУЖЕ ДУЖЕ ЗАКРИТИ.
Авраам Л

1
У мене була така ж проблема і я придивився набагато уважніше до вершин частин, як пропонує Авраам. Насправді вони не були пов’язані між собою. Увімкніть оснащення кінцевої точки і з'єднайте кінцеві вершини разом, проблема вирішена .. для мене anyhoo.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.