Çok parçalı çoklu çizgiden bir parça çoklu çizgi mi yapıyorsunuz?


11

Ben çoklu bölümlere ayrılmıştır bir polyline var ve bu bölümleri köşe noktası kimliği çoklu çizginin çizim takip etmeyecek şekilde iyi sipariş değil.

Bu çoklu hat bir otobüs hattını temsil ediyor ve otobüsün sürüş şeklini izleyerek çizim yapmam gerekiyor. Bu çoklu hattın çoklu bölümlerini nasıl birleştireceğimizi bilmek isterim?

Zaten Split ve Unplit'in yanı sıra Tek Parça, Birlik, Birleştirme vb. İçin Çok Parçalı'yı denedim ama kimse bana istediğim sonucu vermiyor.


@bmoussea, Dissolve aracını kullandınız mı?
artwork21

@ artwork21 Evet yaptım, ancak hiçbir şeyi değiştirmiyor: çoklu
çizgi

Geometri çok parçalı doğru ilk sipariş doğrulamak kontrol help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//... söz sonra artwork21 çözülür
Mapperz

Geometriyi kontrol ettim ve rapor edilen bir sorun yok. Çoklu bölümler checkgeometride görünmüyorlar çünkü bunlar zaten çoklu çizginin parçaları.
bmoussea

Çoklu çizgimin çok bölümleri, çoklu çizgimin bulunduğu katmanı düzenlerken görünür ve ardından sağ klişe üzerinde -> Noktaları Düzenle ve Çizim Özelliklerine bakın. İşte benim çoklu çizgimin farklı kısımlarını (çoklu bölümler) birleştirmek istiyorum.
bmoussea

Yanıtlar:


5

Etiketlerinizden ArcGIS 10 kullandığınızı görüyorum. Benzer bir görev için aşağıdaki yöntemi kullandım:

1) Tek Parçalı Çok Parçalı Kullanın

2) Bölünmemiş kullanın

Bunun çalışması için (yani, doğru sırada çizgiler elde edebilmeniz için) çizgiyi kurucu bitiş noktalarına bölmeniz ve ardından bir özniteliğe göre yönü değiştirmeniz gerekebilir (örn. 1 = başlangıç, 2 = bitiş) - bunu yalnızca farklı noktaları koşullu olarak bağlamak için kullanabilirsiniz (1 + 2 ise bağlantı çizgileri oluşturursanız).

Bir IDE ile çalışıyorsanız, bunu yapmak için kod oldukça uzundur, ancak belirli sorularınız varsa yardımcı olmak için elimden geleni yapacağım.


1
"Bölünmemiş Çizgi" bir ArcInfo lisansı gerektirir. Bu lisans düzeyine sahip değilseniz "Çöz" seçeneğini kullanın, Bölünmemiş Satır seçeneği vardır.
klewis

1

AV 3.x ve Avenue kullanarak tam olarak aynı şeyi yapmak zorunda kaldım. Kod için hızlı bir göz vardı ama bulamadım. Eğer doğru hatırlıyorsam mantık böyle bir şey gitti: (Ben de başlangıç ​​ve bitiş parçaları belirlemek mümkün böylece farklı bir şekil şekil dosyası olarak otobüs durakları ve terminaller vardı):

  1. Sıralanan parçaları almak için boş bir çoklu çizgi oluşturun. Buna 'sıralanmış çoklu çizgi' diyelim
  2. İlk kısmı almak için:

    2a. Terminali başlatmak için en yakın parçayı alın

    2b. Bu parçanın başlangıç ​​ve bitiş düğümünün başlangıç ​​terminaline olan mesafelerini alın. Başlangıç ​​tepe noktası en yakın olanı ise bu bölümü 'sıralanmış çoklu çizgiye' ekleyin. Eğer sonu FLIP ve sonra ekleyin.

  3. Orta ve uç parçaları almak için, önceki adımda ve bir süre (true) döngüsü içinde oluşturduğunuz parça (çoklu çizgi) ile başlayın, ilk parçanın uç düğümü ile girişteki diğer parçalar arasındaki mesafeyi karşılaştırmaya başlayın. Çoklu çizgi. En yakın olanı 'bir sonraki bölüm'dür. Bir sonraki parçanın başlangıç ​​ve bitiş düğümünün mesafesini, 'sıralı çoklu çizgiye' eklemeden önce çevirip çevirmeyeceğinizi belirlemek için karşılaştırın
  4. 'Sıralı çoklu çizgideki' parça sayısı girdi çoklu çizgisindeki ile aynı olduğunda döngüden çıkın.

... ya da böyle bir şey! :-)

Bunun sizin için anlamlı olup olmadığını bana bildirin ve orijinal Avenue kodumu bulmak için başka bir gidebilirim.


1

Buna benzer bir projede çalıştım, ArcObjects kullandım. Hedefim, bitiş noktalarından biri diğerinin başlangıç ​​noktası ise iki kısa çoklu çizgiyi tek bir çoklu çizgiye dönüştürmekse iki bitişik çoklu çizgiyi birleştirmekti. Benim sürecim:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey bir nokta içeren bir sınıftır.
  • FeatureDataList, IFeatures Listesini içeren bir sınıftır.
  • Her iki sınıf da "Eşittir" ve "GetHashCode" yöntemlerini geçersiz kılar.

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

Bu süreçlerle iki sözlük yaptım. Sözlükler oluşturduktan sonra, her iki sözlükte de aynı nokta olup olmadığını kontrol ediyorum ve her iki sözlükte de bu anahtarın özellik listesinde yalnızca bir özelliği var, o zaman bu iki çoklu çizgiyle yeni bir çoklu çizgi oluşturdum ve iki kısa çoklu çizgiyi sildim.

İki çoklu çizgiyi bir birleştirmek için:

   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

"Yeniden Şekillendirme Özelliği" Aracı'nı kullanarak otobüs güzergahları için yaptığım güncellemeler nedeniyle aynı sorunu yaşadım. Çok parçalı özellikler rastlantısal olmadığından Erime, Birleştirme ve Unsplit çalışmadı.

Bunu şimdiye kadar fark etmediyseniz, çok parçalı özellikleriniz arasında çakışması gereken köşelere daha yakından bakın. Gerektiği gibi uzatın, kesin veya yeniden şekillendirin ve sonra yukarıda belirtilen araçlardan herhangi birini kullanın.


Oh, ve bu arada: "yakından bakmak" ile ÇOK ÇOK KAPALI demek istiyorum.
Abraham L

1
Aynı problemi yaşadım ve Abraham'ın önerdiği gibi parça uç köşelerine çok daha yakından baktım. Aslında bağlantılı değildiler. Uç nokta yakalamayı açın ve uç köşeleri birbirine yapıştırın, sorun çözüldü .. benim için herhangi bir şey.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.