Делать одну полилинию из нескольких частей?


11

У меня есть ломаная линия, которая разделена на несколько частей, и эти части не упорядочены так, что идентификатор вершины не соответствует графику ломаной линии.

Эта полилиния представляет собой линию автобуса, и мне нужно, чтобы график следовал по маршруту движения автобуса. Я хотел бы знать, как объединить мультипликаторы этой полилинии?

Я уже пробовал разделять и отменять разделение, а также разделять на отдельные части, объединять, объединять и т. Д., Но никто не дает мне желаемого результата.


@bmoussea, ты использовал инструмент Dissolve?
artwork21

@ artwork21 Да, я сделал, но это ничего не меняет: ломаная по-прежнему делится на несколько
частей

Проверка геометрии проверить , что из нескольких частей заказана правильно первый help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//... затем распустить artwork21 упоминает
Mapperz

Я проверил геометрию, и о проблемах не сообщалось. Мультиэлементы не отображаются в контрольной геометрии, поскольку они уже являются частями ломаной линии.
bmoussea

Мультипликаторы моей полилинии появляются при редактировании слоя, где находится моя полилиния, а затем щелкните правой кнопкой мыши на нем -> Редактировать вершины и посмотрите в Свойства эскиза. Вот различные части (множественные части) моей полилинии, которую я хотел бы объединить.
bmoussea

Ответы:


5

По вашим тегам я вижу, что вы используете ArcGIS 10. Я использовал следующий метод для аналогичной задачи:

1) Используйте Multipart для одной части

2) Используйте Unsplit

Чтобы это работало (т. Е. Чтобы у вас были линии в правильном порядке), вам может потребоваться разбить линию на составляющие конечные точки, а затем изменить направление на основе атрибута (например, 1 = начало, 2 = конец) - вы можете использовать это для условного соединения только тех точек, которые отличаются (если 1 + 2, то создайте соединительные линии).

Если вы работаете с IDE, код для этого достаточно длинный, но я сделаю все возможное, чтобы помочь, если у вас есть конкретные вопросы.


1
«Unsplit Line» требует лицензии ArcInfo. Если у вас нет этого уровня лицензии, тогда используйте «Растворить», у него есть опция Unsplit Line.
Klewis

1

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

  1. Создайте пустую ломаную линию для получения отсортированных частей. Давайте назовем это «сортированной ломаной»
  2. Чтобы получить первую часть:

    2а. Получить часть, ближайшую к стартовому терминалу

    2b. Получите расстояния начального и конечного узла этой части до начального терминала. Если начальная вершина самая близкая, добавьте эту часть к «отсортированной полилинии». Если это конец - переверните его, а затем добавьте.

  3. Чтобы получить среднюю и конечную части, начните с части (полилинии), созданной на предыдущем шаге, и в цикле while (true) начните сравнивать расстояние между конечным узлом первой части и другими частями во входных данных. ломаная. Наиболее близким является «следующая часть». Сравните расстояние начального и конечного узла следующей части, чтобы определить, следует ли перевернуть его или нет, прежде чем добавлять его к «отсортированной полилинии».
  4. Выходите из цикла, когда номер детали в «отсортированной полилинии» такой же, как во входной полилинии.

... или что-то вроде того! :-)

Дайте мне знать, если это имеет смысл для вас, и я могу еще раз найти мой оригинальный код авеню.


1

Я работал над проектом, похожим на это, я использовал ArcObjects. Моя цель состояла в том, чтобы соединить две соседние полилинии, если одна из ее конечных точек является отправной точкой для другой, чтобы превратить две короткие полилинии в одну полилинию. Мой процесс был:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey - это класс, который содержит точку.
  • FeatureDataList - это класс, который содержит список IFeatures.
  • Оба класса переопределяют методы «Equals» и «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.