Membuat satu bagian polyline dari multipart polyline?


11

Saya memiliki polyline yang dibagi menjadi beberapa bagian dan bagian-bagian ini tidak tertata dengan baik sehingga ID vertex tidak mengikuti plot polyline.

Polyline ini merupakan jalur bus yang mewakili dan saya harus memiliki plot mengikuti cara mengemudi bus. Saya ingin tahu cara menggabungkan multipart dari polyline ini?

Saya sudah mencoba untuk Berpisah dan Tidak Terpisah, serta Multipart ke Bagian Tunggal, Gabungan, Penggabungan, dll. Tetapi tidak ada yang memberi saya hasil yang saya inginkan.


@ bmoussea, apakah Anda menggunakan alat Dissolve?
artwork21

@ artwork21 Ya saya lakukan, tetapi tidak mengubah apa-apa: polyline masih dibagi dalam beberapa bagian ...
bmoussea

Periksa Geometri untuk memverifikasi bahwa multi-bagian tersebut dipesan dengan benar, pertama help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//... lalu bubar artwork21 yang disebut
Mapperz

Saya memeriksa geometri dan tidak ada masalah yang dilaporkan. Multipart tidak muncul di checkgeometry karena sudah menjadi bagian dari polyline.
bmoussea

Multipart dari polyline saya muncul saat mengedit layer di mana polyline saya berada, dan kemudian klik kanan di atasnya -> Edit Vertices dan lihat di Sketch Properties. Berikut adalah bagian differents (multi bagian) dari polyline saya yang ingin saya gabungkan.
bmoussea

Jawaban:


5

Saya melihat dari tag Anda bahwa Anda menjalankan ArcGIS 10. Saya telah menggunakan metode berikut untuk tugas yang serupa:

1) Gunakan Multipart ke Satu Bagian

2) Gunakan Unsplit

Agar ini berfungsi (yaitu agar Anda memiliki garis dalam urutan yang tepat), Anda mungkin perlu memecah garis menjadi titik akhir konstituen dan kemudian mengubah arah berdasarkan atribut (misalnya 1 = mulai, 2 = ujung) - Anda dapat menggunakan ini untuk menghubungkan secara kondisional hanya titik-titik yang berbeda (Jika 1 + 2 maka buat garis penghubung).

Jika Anda bekerja dengan IDE, kode untuk melakukan ini cukup panjang, tetapi saya akan melakukan yang terbaik untuk membantu jika Anda memiliki pertanyaan spesifik.


1
"Unsplit Line" memerlukan lisensi ArcInfo. Jika Anda tidak memiliki level lisensi ini kemudian gunakan "Dissolve", ia memiliki opsi Line Unplit.
klewis

1

Saya harus melakukan hal yang persis sama beberapa waktu lalu menggunakan AV 3.x dan Avenue. Saya sempat melihat-lihat kodenya tetapi tidak bisa menemukannya. Jika saya ingat dengan benar, logikanya kira-kira seperti ini: (Saya juga memiliki halte dan terminal sebagai titik pembentuk yang berbeda sehingga saya dapat menentukan bagian awal dan akhir):

  1. Buat polyline kosong untuk menerima bagian yang diurutkan. Mari kita sebut 'polyline yang diurutkan'
  2. Untuk mendapatkan bagian pertama:

    2a. Dapatkan bagian yang paling dekat dengan terminal mulai

    2b. Dapatkan jarak titik mulai dan titik akhir bagian ini ke terminal mulai. Jika titik awal adalah yang paling dekat tambahkan bagian ini ke 'polyline yang diurutkan'. Jika ini akhir, FLIP, lalu tambahkan.

  3. Untuk mendapatkan bagian tengah dan akhir, mulailah dengan bagian (polyline) yang Anda buat pada langkah sebelumnya dan dalam beberapa saat (benar) loop, mulai membandingkan jarak antara simpul akhir dari bagian pertama ke bagian lain di input polyline. Yang paling dekat adalah 'bagian selanjutnya'. Bandingkan jarak simpul mulai dan akhir dari bagian berikutnya untuk menentukan apakah akan membalik atau tidak sebelum menambahkannya ke 'polyline yang diurutkan'
  4. Keluar dari loop ketika jumlah bagian dalam 'polyline yang diurutkan' sama dengan pada input polyline.

... atau semacam itu! :-)

Beri tahu saya jika ini masuk akal bagi Anda dan saya dapat mencoba lagi menemukan kode Avenue asli saya.


1

Saya bekerja di proyek yang mirip dengan ini, saya menggunakan ArcObjects. Tujuan saya adalah menghubungkan dua polyline yang berdekatan jika salah satu titik akhirnya adalah titik awal yang lain untuk membuat dua polyline pendek menjadi satu polyline. Proses saya adalah:

1. Dictionary<PointKey, FeatureDataList> polylineDictionary;
  • PointKey adalah kelas yang berisi titik.
  • FeatureDataList adalah kelas yang berisi Daftar IFeatures.
  • Kedua kelas menimpa metode "Equals" dan "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);
        }
    }
    

Dengan proses ini saya membuat dua kamus. Setelah membuat kamus, saya memeriksa apakah kedua kamus berisi titik yang sama dan di kedua kamus, kunci itu hanya memiliki satu fitur dalam daftar fitur, kemudian saya membuat polyline baru dengan dua polyline tersebut dan menghapus dua polyline pendek.

Untuk menggabungkan dua polyline menjadi satu:

   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

Saya memiliki masalah yang persis sama karena pembaruan yang saya buat ke rute bus menggunakan Alat "Ubah Bentuk". Dissolve, Merge dan Unsplit tidak berfungsi karena fitur multi-bagian tidak bersamaan.

Jika Anda belum melihat ini sekarang, lihat lebih dekat pada simpul yang harus bertepatan antara fitur multi-bagian Anda. Perluas, rapikan, atau bentuk ulang seperlunya dan gunakan salah satu alat yang disebutkan di atas.


Oh, dan omong-omong: Dengan "melihat lebih dekat" Maksudku SANGAT SANGAT DEKAT.
Abraham L

1
Saya memiliki masalah yang sama dan melihat jauh lebih dekat pada simpul bagian akhir seperti yang disarankan Abraham. Mereka, pada kenyataannya, tidak terhubung. Nyalakan gertakan titik akhir dan pasang simpul ujung bersamaan, masalah terpecahkan .. bagi saya anyhoo.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.