Daha çox

ArcPy istifadə edərək iki xüsusiyyət sinifinin sahə dəyərlərini müqayisə etmək?

ArcPy istifadə edərək iki xüsusiyyət sinifinin sahə dəyərlərini müqayisə etmək?


İstehsal fc # 2-yə əlavə etmək istədiyim məlumatları ehtiva edən bir ara fc # 1 (son nəticə) var. Verilərlə işləyərkən, təkrarlanan sənədlərdən və s. Qarşısını almaq üçün yalnız # 2-də olmayan fc # 1-dən məlumat əlavə etmək istərdim. Yoxlamaq istədiyim sahəSR nömrəsiYalnızca # 1-dən FC # 2-yə əlavə etmək istərdimSR nömrəsiFC # 2-də deyil. Bunu ArcPy vasitəsilə etmək olar?

Bəlkə siyahıda olan fc # 1 SRNumber mağazasından sahələrin dəyərlərini əldə edin və fc # 2-yə siyahıda olmayan bir şey yazın?


Budur, bu yaxınlarda yaratdığım, seçilmiş bütün qeydləri bir fc / cədvəldən başqa bir fc / cədvələ əlavə edəcək bir Python alət qutusu aləti. Bütün sahə uyğunluğunu yerinə yetirir və girişlərin uyğun həndəsə və tətbiq olunduğu zaman məkan referansı ilə uyğun tip olduğundan əmin olmaq üçün girişləri təsdiqləyir. Kopyalama / yapışdırmaq kimi davranır, istisna olmaqla StandAlone Cədvəlləri üçün də işləyir (FC-dən Bağımsız bir cədvələ əlavə etmək istədiyiniz zaman ArcMap dəstəkləmir). Bağımsız Cədvəldən FC-yə əlavə etməyi dəstəkləmir, lakin digər 3 kombinasiyanı da dəstəkləyir (FC - FC, FC - Cədvəl və Cədvəl - Cədvəl). Çox sürətli.

Orijinal alət yalnız ilk FC / cədvəldə seçilmiş hər hansı bir şeyi əlavə etdi, amma bütün SRNumber-ləri fc 2-dən (insertFC) bir lüğətə toplamaq və insertFC-dəki hər hansı bir SRNumerin atlandığını doğrulamaq üçün sətir əlavə etmək üçün onu aşağıdakı kodda dəyişdirdim. belə ki, yalnız FC 1-də (FC) insertFC-də tapılmayan qeydlər daxil edilir. (Bununla birlikdə, bu dəyişiklik sınaqdan keçirilməyib və əvvəlcə məlumatlarınızla bir şey etmədən əvvəl işlədiyinə əmin olmaq üçün məlumatlarınızın bir nüsxəsində istifadə etməlisiniz). Yalnız SRNumber davranışına dair bu yazıda xüsusi istəyi həll etmək üçün orijinal kodda hansı dəyişikliklər etdiyimi qeyd etmək üçün şərhlər əlavə etdim.

Buna görə yeni bir Python alət qutusu yaradın və altındakı kodu daxil edin. Daha sonra cari xəritənizə hər iki ədədi əlavə edin və FC 1-dəki hər bir xüsusiyyəti seçin. Sonra aləti çalıştırın və ilk FC-ni FC 1 edin və FC-ni FC-yə çevirin. Aləti çalıştırmadan əvvəl açıq masa görünüşünü bağlayın, çünki mövcuddur. Esrinin günahı olan bir yeniləmə problemi (Əlavə etmə vasitəsi eyni problemə sahibdir) və alət işlədikdən sonra cədvəl görünüşünü yenidən açın və yeni daxil edilmiş xüsusiyyətlərin seçildiyini görəcəksiniz. Bir Redaktor sessiyanız varsa, düzəlişləri saxlamadan redaktə sessiyasını dayandırsanız, əlavə xəbərdarlıq etmədən yox olacaq. Ancaq düzəlişləri qurtarsanız, əlavə qalıcı olacaq.

idxal arcpy sinfi Toolbox (obyekt): def __init __ (self): "" "Alətlər qutusunu təyin edin (alət qutusunun adı .pyt faylının adıdır)." "" self.label = "Sahə uyğunlaşma alətləri" özü. alias = "" # Bu alət qutusu ilə əlaqəli alət siniflərinin siyahısı self.tools = [InsertSelectedFeaturesOrRows] class InsertSelectedFeaturesOrRows (object): def __init __ (self): "" "Aləti müəyyənləşdirin (alət adı sinifin adıdır)." "" self.label = "Seçilmiş Xüsusiyyətləri və ya Satırları daxil edin" self.description = "" self.canRunInBackground = False def getParameterInfo (self): "" "Parametr təriflərini təyin edin" "" # Birinci parametr param0 = arcpy.Parameter (displayName = "Giriş Qatı və ya Cədvəl Görünüşü", name = "in_prim_table", datatype = "GPTableView", parameterType = "Lazım", istiqamət = "Giriş") # İkinci parametr param1 = arcpy.Parameter (displayName = "Çıxış Qatı və ya Cədvəl Görünüşü" , name = "out_table", datatype = "GPTableView", parameterType = "Required", direction = "Input") # Üçüncü parametr param2 = arcpy.Parameter (displayName = "Daxil Ediləcək Nüsxələrin Sayı sert ", name =" number_of_row_copies ", datatype =" GPLong ", parameterType =" Required ", direction =" Input ") param2.value = 1 # Dördüncü parametr param3 = arcpy.Parameter (displayName =" Derived Layer or Table View " , name = "derived_table", datatype = "GPTableView", parameterType = "Derived", direction = "Çıxış") param3.parameterDependencies = [param1.name] param3.schema.clone = True params = [param0, param1, param2, param3] return params def isLicensed (self): "" "Alətin icrası üçün lisenziyalı olub olmadığını təyin edin." "" return True def updateParameters (self, parametrlər): "" "Daxili doğrulama həyata keçirilmədən əvvəl parametrlərin dəyərlərini və xüsusiyyətlərini dəyişdirin. Bu metod bir parametr dəyişdirildikdə çağırılır. "" "Return def updateMessages (self, parametrlər):" "" Hər bir alət parametri üçün daxili doğrulama ilə yaradılan mesajları dəyişdirin. Bu metod daxili doğrulamadan sonra çağırılır. "" "Əgər parametrlər [1] .value: insertFC = parametrlər [1] .value strInsertFC = str (insertFC) parametrlər [0] .value və ' 0: çap ("{} {} {} {} seçdi" .format (FCLyr.name, len (selection_set.split (';')), 'xüsusiyyət' if ' 'Həndəsə' və insertFCfield.editable == Doğru və deyil (FCfield.name.upper () in matchedFields)): matchedFields.append (FCfield.name) break elif (FCfield.type == 'Geometry' and FCfield.type == insertFCfield.type): matchedFields.append ("SHAPE @") break elif insertFCfield.type == "OID": oid_name = insertFCfield.name if len (matchedFields)> 0: # Uyğun sahələrin siyahısını çap edin ("Uyğun sahələr" bunlar: {} ". format (matchedFields)) arcpy.AddMessage (" Uyğunlaşdırılan sahələr: {} ". format (matchedFields)) nüsxələr = parametrlər [2] .value print (" Hər birinin {} {} edilməsi) ".format (nüsxələr," kopyalar "varsa == 1 başqa" nüsxələr "," xüsusiyyət "əgər" 1: whereclause = oid_name + ' in="" ('="" +="" ','.join(map(str,="" oid_list))="" +="" ')'="" if="" len(oid_list)=""> 0: # arcpy.AddMessage (whereclause) # Xüsusiyyət seçimini dəyişdirin arcpy.SelectLayerByAttribute_management (FCLyr, "CLEAR_SELECTION", "") arcpy.SelectLayerByAttribute_management (insertFCLyr, "NEW_SELECTION", wherecla}) {} ". format (len (oid_list), 'xüsusiyyət' if ''

@PolyGeo-nun da qeyd etdiyi kimi, bir əlavə imleci tərəfindən aparılan axtarış imleci burada hiylə işlədir. Əvvəlcə fc3-dən bütün dəyərləri bir az piton siyahısını anlama və axtarış imleci ilə silin. Sonra fc2-də satırlar arasında təkrarlayın. Siyahınızdakı yoxlama sahəsindəki dəyərləri yoxlayın. Dəyər siyahınızda deyilsə, fc2 sətrini fc3-ə daxil edin.

Ssenari, bütün sahələrin tam olaraq eyni olduğunu və iki xüsusiyyət sinfi arasında eyni qaydada olduğunu və 10.1 və ya daha sonrası ilə işlədiyinizi düşünür.

import arcpy #input xüsusiyyət sinfi fc2 = r "C:  temp  temp.gdb  fc2" # hədəf xüsusiyyət sinfi fc3 = r "C:  temp  temp.gdb  fc3" # sahəni yoxla checkField = "SRNumber" # Get hədəf xüsusiyyət sinfi sahəsindəki dəyərlərin siyahısı checkValues ​​= set ([r [0] for r in arcpy.da.SearchCursor (fc3, checkField)])) # Sahələrin siyahısını alın = [f.name for f in arcpy.ListFields (fc2)] # Check alanının indeksini alın = field.index (checkField) # satırların əlavə edilməsinə icazə vermək üçün fc3 üçün imleci yaradın inCursor = arcpy.da.InsertCursor (fc3, sahələr) # Giriş xüsusiyyət sinifini təkrarlamaq üçün axtarış imleci yaradın cursor = arcpy.da.SearchCursor (fc2, sahələr) # kursordakı sətri göstərin: # checkValue = satır [index] yoxlamaq üçün dəyər alın # CheckCalue in checkValue olduqda dəyərin hədəfdə olduğunu yoxlayın: # value is is at fc davamı # Əks təqdirdə sətir daxil edin inCursor.insertRow (sıra) # Təmizləyin del cursor del inCursor

Yoxlanılmamış - orfoqrafiya səhvi və ya iki və ya üçü ola bilər. Pythoninq mübarək!