lt.geologyidea.com
Daugiau

Lyginant dviejų funkcijų klasių lauko reikšmes naudojant „ArcPy“?

Lyginant dviejų funkcijų klasių lauko reikšmes naudojant „ArcPy“?


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.


Turiu tarpinį fc # 1, kuriame yra duomenys, kuriuos norėčiau pridėti prie savo gamybos fc # 2 (galutinė išvestis). Dirbdamas su duomenimis, norėčiau tik pridėti duomenis iš savo fc # 1, kurie nėra fc # 2, kad išvengčiau dublikatų ir pan. Mano laukas, kurį norėčiau patikrinti, yraSRNumberNorėčiau pridėti tik nuo fc # 1 iki fc # 2, kaiSRNumbernėra fc # 2. Ar tai galima padaryti per ArcPy?

Gal gauti laukų reikšmes iš fc # 1 SRNumber parduotuvės sąraše ir įrašyti viską, kas nėra sąraše, į fc # 2?


Štai neseniai sukurtas „Python“ įrankių rinkinio įrankis, kuris įterps visus pasirinktus įrašus iš vieno fc / lentelės į kitą fc / lentelę. Jis suderina visus laukus ir patvirtina įvestis, kad įsitikintų, ar įėjimai yra suderinami tipai su atitinkama geometrija ir erdvine nuoroda, kai taikoma. Tai veikia kaip kopijavimas / įklijavimas, išskyrus tai, kad jis veikia ir „StandAlone“ lentelėse (kažkas „ArcMap“ nepalaiko, kai norite pridėti iš FC prie atskiros lentelės). Jis nepalaiko įdėklų iš atskiros lentelės į FC, tačiau palaiko visus 3 kitus derinius (FC - FC, FC - Table ir Table - Table). Tai labai greita.

Originalus įrankis ką tik įterpė viską, kas pažymėta pirmojoje FC / lentelėje, bet aš jį pakeičiau žemiau esančiame kode, kad pridėčiau eilutes, kad visi SRNumeriai būtų surinkti į žodyną iš fc 2 („insertFC“) ir patvirtintų, kad bet koks „SRNumber“ yra „inserttFC“ kad būtų įterpiami tik įrašai iš fc 1 (FC), kurių nerasta įterpime FC. (Tačiau šios modifikacijos nebuvo išbandytos, todėl pirmiausia turėtumėte naudoti ją savo duomenų kopijoje, kad įsitikintumėte, jog ji veikia, prieš pradėdami ką nors daryti su pagrindiniais duomenimis). Pridėjau komentarų, norėdamas atkreipti dėmesį į tai, kokius pakeitimus atlikau pradiniame kode, kad išspręstų konkretų prašymą šiame įraše dėl SRNumber elgesio.

Taigi sukurkite naują „Python“ įrankių rinkinį ir į jį įterpkite žemiau esantį kodą. Tada pridėkite abu fcs prie dabartinio žemėlapio ir pažymėkite visas funkcijas fc 1. Tada paleiskite įrankį ir padarykite pirmąjį FC savo fc 1, o įterpimą FC paverskite fc 2. Prieš paleisdami įrankį uždarykite bet kurį atidarytą lentelės vaizdą, nes yra atnaujinimo problema, dėl kurios kaltas Esri („Append“ įrankis turi tą pačią problemą) ir paleidus įrankį vėl atidarykite lentelės rodinį ir pamatysite pasirinktas naujai įterptas funkcijas. Jei turite redaktoriaus sesiją, intarpai dings be įspėjimo, jei sustabdysite redagavimo sesiją neišsaugoję pakeitimų. Bet jei išsaugosite pakeitimus, įdėklai bus nuolatiniai.

importuoti arcpy klasės įrankių rinkinį (objektą): def __init __ (savarankiškai): "" "Apibrėžkite įrankių dėžę (įrankių rinkinio pavadinimas yra .pyt failo pavadinimas)." "" self.label = "Field Match Tools" savarankiškai. alias = "" # Įrankių klasių, susijusių su šia įrankių dėže, sąrašas self.tools = [InsertSelectedFeaturesOrRows] klasė InsertSelectedFeaturesOrRows (objektas): def __init __ (self): "" "Apibrėžkite įrankį (įrankio pavadinimas yra klasės pavadinimas)." "" self.label = "Įterpti pasirinktas funkcijas ar eilutes" self.description = "" self.canRunInBackground = False def getParameterInfo (self): "" "Define parametro apibrėžimai" "# Pirmasis parametras param0 = arcpy.Parameter (displayName = "Įvesties sluoksnio arba lentelės rodinys", name = "in_prim_table", duomenų tipas = "GPTableView", parametrasType = "Būtinas", direction = "Įvestis") # Antrasis parametras param1 = arcpy.Parameter (displayName = "Išvesties sluoksnis arba lentelės rodinys" , name = "out_table", datatype = "GPTableView", parametroType = "Būtina", direction = "Įvestis") # Trečias parametras param2 = arcpy.Parameter (displayName = "Kopijų skaičius į sert ", name =" number_of_row_copies ", datatype =" GPLong ", parametrasType =" Būtinas ", direction =" Įvestis ") param2.value = 1 # Ketvirtasis parametras param3 = arcpy.Parameter (displayName =" Išvestinis sluoksnio arba lentelės rodinys " , name = "gautas_tabelis", duomenų tipas = "GPTableView", parametrasTipas = "Išvestinis", kryptis = "Išvestis") param3.parameterDependencies = [param1.name] param3.schema.clone = Tikrieji parametrai = [param0, param1, param2, param3] return params def isLicensed (self): "" "Nustatykite, ar įrankis turi licenciją vykdyti." "" grąžinkite True def updateParameters (self, parametrai): "" "Prieš atlikdami vidinį patvirtinimą, pakeiskite parametrų reikšmes ir savybes. Šis metodas iškviečiamas, kai parametras yra pakeistas. "" "Return def updateMessages (self, parametrai):" "" Keiskite pranešimus, sukurtus atliekant vidinį kiekvieno įrankio parametro patvirtinimą. Šis metodas vadinamas po vidinio patikrinimo. "" "Jei parametrai [1] .value: insertFC = parametrai [1] .value strInsertFC = str (insertFC) jei parametrai [0] .value ir ' 0: spausdinti ("{} pasirinko {} {} {}" formatą (FCLyr.name, len (selection_set.split (';'))), 'feature' if ' 'Geometry' ir insertFCfield.editable == Tiesa ir ne (FCfield.name.upper () in matchedFields)): matchedFields.append (FCfield.name) pertraukos elif (FCfield.type == 'Geometry' ir FCfield.type == insertFCfield.type): matchedFields.append ("SHAPE @") break elif insertFCfield.type == "OID": oid_name = insertFCfield.name if len (matchedFields)> 0: # Spausdinti suderintų laukų sąrašo spausdinimą ("Atitinkami laukai yra: {} ". format (matchedFields)) arcpy.AddMessage (" Atitinkami laukai yra: {} ". format (matchedFields)) kopijos = parametrai [2] .value print (" Kiekvieno {} gaminimas {} {}) ".formatas (kopijos, 'kopija', jei kopijos == 1 kitas 'kopijos', 'funkcija' jei ' 1: whereclause = oid_name + ' in="" ('="" +="" ','.join(map(str,="" oid_list))="" +="" ')'="" if="" len(oid_list)=""> 0: # arcpy.AddMessage (whereclause) # Perjungti funkcijų pasirinkimą arcpy.SelectLayerByAttribute_management (FCLyr, "CLEAR_SELECTION", "") arcpy.SelectLayerByAttribute_management (insertFCLyr, "NEW_SELECTION", whereclause} spausdinti { {} ". formatas (len (oid_list), 'feature' if '

Kaip minėjo @PolyGeo, paieškos gudrybė, atlikta įterpiant žymeklį, čia padarys triuką. Pirmiausia suimkite visas „fc3“ reikšmes su mažu python sąrašo supratimu ir paieškos žymekliu. Tada kartokite fc2 eilutes. Patikrinkite tikrinimo lauke esančias vertes pagal savo sąrašą. Jei vertės nėra jūsų sąraše, įterpkite fc2 eilutę į fc3.

Scenarijuje daroma prielaida, kad visi laukai yra visiškai vienodi ir ta pačia tvarka tarp dviejų funkcijų klasių, o jūs dirbate su 10.1 ar naujesne versija.

importuoti „arcpy“ # įvesties funkcijų klasę fc2 = r "C:  temp  temp.gdb  fc2" # tikslinių funkcijų klasė fc3 = r "C:  temp  temp.gdb  fc3" #check field checkField = "SRNumber" #Get reikšmių sąrašas lauke iš tikslinių funkcijų klasės checkValues ​​= set ([r [0] for r in arcpy.da.SearchCursor (fc3, checkField)]) #Get laukų laukų sąrašas = [f.pavadinimas f lauke arcpy.ListFields (fc2)] #Gaukite tikrinimo lauko indeksą = laukai.index (checkField) # Sukurkite įterpimo žymeklį fc3, kad būtų galima pridėti eilučių inCursor = arcpy.da.InsertCursor (fc3, laukai) # Sukurkite paieškos žymeklį, kad pakartotumėte įvesties funkcijų klasę cursor = arcpy.da.SearchCursor (fc2, laukai) # žymeklio eilutės pakartojimas: # Gaukite vertę patikrinti checkValue = eilutė [rodyklė] # Patikrinkite, ar reikšmė yra tiksliniame fc, jei checkValue yra checkValues: # skip, jei reikšmė yra tiksle fc tęsti # Įterpti eilutę kitaip inCursor.insertRow (row) # Clean up del cursor del inCursor

Nepatikrinta - gali būti rašybos klaida arba dvi ar trys. Laimingo pitonavimo!