Daha çox

ArcPy istifadə edərək çoxbucaqlının içindəki xətt zirvələri silinir?


ArcGIS-də bir çoxbucaqlı faylı istifadə edərək xətt xüsusiyyətlərindəki zirvələri avtomatik olaraq silməyin bir yolu varmı ki, xətti kəsməsin, ancaq çoxbucağın içindəki xətti düzəltsin?

Xətlər xətlərdir və qutu onları əhatə edən bir çoxbucağı təmsil edir. Çoxbucağın içərisindəki xətt təpələrini silmək istəyirəm ki, xətt təsvirdəki kimi çoxbucaqlı sərhədin içərisində düz olsun.

ArcGIS 10.1 istifadə edirəm, amma bir şey həll edərsə, digər proqram təminatına sahibəm.


Ətraflı bir lisenziyanın faydalı olacağı yerdir.

  1. "Klip etmək üçün Klip alətindən istifadə edinXətt"xüsusiyyət sinfi (FC) tərəfindən"Çoxbucaqlı"FC. Çıxışa ad verin"Sətirlər_ İçəridə".
  2. Bunun əksini etmək üçün Silmək alətindən istifadə edin və çoxbucaqlıların içərisinə düşən sətirləri silin. Çıxışa ad verin "Xəttlər_ xaricdə".
  3. Üçün "Sətirlər_İçəridə"FC, hər sətrin başlanğıc və bitmə düyünü üçün bir nöqtə yaratmaq üçün" BOTH_ENDS "seçimini göstərən Xüsusiyyət Vertices to Points alətindən istifadə edin." Adlı bir sahə yaradın. "LineID"hər bir başlanğıc və bitmə nöqtəsinin hansı sətirə aid olduğunu unikal şəkildə müəyyənləşdirir (bunu Qoşulma və ya Mekansal Qoşulma və ya Seçim və ya başqa bir şəkildə edə bilərsiniz). Təəssüf ki, dəqiq addımları sınamaq üçün qarşımda Ətraflı bir lisenziyam yoxdur.
  4. Yaratmaq üçün 3 nömrəli addımdan nəticələrinizə Xəttdən Xətti alətindən istifadə edin düz xətt orijinalın başlanğıc və bitiş nöqtələri xaricində "Sətirlər_ İçəridə"FC. Siz özünüzü göstərməlisiniz"LineID"" Line_Field "parametri üçün Addım 3-də yaratdığınız sahə.
  5. Addım # 4 nəticələrini birləşdirin / əlavə edin / məlumatları özünüzə yükləyin "Sətirlər_Dışında"İki FC'yi bir araya gətirmək üçün FC.
  6. Parçaları tək bir sətirdə birləşdirmək üçün Bölünməmiş Xətt alətindən və ya Çözün alətindən istifadə edin. Alətləri işə salmadan əvvəl atributları orta hissələrə (yaratdığınız) geri qaytarmaq üçün bir Məkan Qoşulma etməli ola bilərsiniz.

Ümid edirəm kömək edər. İnkişaf etmiş bir lisenziyaya ehtiyacınız varsa, əldə edə bildiyim zaman ekran görüntüləri əlavə edə bilərəm. Bu addımların işləməyəcəyini düşünə biləcəyim yeganə həll yolu, FC'nizdəki hər bir arcpy.polyline üçün arcpy.array obyektindəki zirvələr siyahısı ilə qarışıq olmaq olacaqdır, bu inkişaf etmiş lisenziyasız həyata keçirilə bilər, lakin xeyli çətindir. bəzi Python bacarıqları olmadan.


Əsas odur fərq həndəsə obyektləri üzərində metod. Aşağıdakı kod effektivdən çox uzaqdır, çünki hər çoxbucaqlı üçün yeni bir yeniləmə imleci açılır. Ancaq eyni sətirdə birdən çox poliqonu dəstəkləmək üçün əlavə fayda var:

idxal itertools, arcpy arcpy.env.overwriteOutput = True line_FC = r ''poly_FC = r''çıxış = r''# sürətli işləmə üçün yaddaşa temp = arcpy.CopyFeatures_management (line_FC, "in_memory / temp") çoxbucaqlı = arcpy.CopyFeatures_management (poly_FC, arcpy.Geometry ()) çoxbucaqlı poli üçün yaddaş ilə: arcpy.da.UpdateCor ilə temp, ["SHAPE @"]) uCursor kimi: uCursordakı sətir üçün: line = line [0] diff = line.difference (poly) # əgər iki sətir bərabər deyilsə, demək çoxsaylı deyilsə çoxbucaqlı kəsişmişdir. bərabərdir (diff): # həndəsə nəticəsi.difference () yalnız çoxbucaqlı hissələrin xaricində yalan # hissələrin çox hissəli sətiridir = diff.getPart () #if hissələri boşdursa, xətt tamamilə çoxbucaq içərisindədir # yəni hissələr fərqi yoxdur: # Part1-in sonunu hissənin əvvəlinə "qoşmaq" lazımdır # buna görə sadəcə qoşulmuş siyahıların siyahısını düzəldəcəyik = list (itertools.chain.from_iterable (parts)) # və şəkli yeniləmək üçün yeni bir polyline obyekt yaradın poly_trimmed = arcpy.Polyline (arcpy.Array (qoşuldu)) uCursor.updateRow ([poly_trimmed]) arcpy.CopyFeatures_management (temp, output)

Kənar hallarda sınaqdan keçirməmişəm, ancaq bu işə başlamalısınız.