Daugiau

„ArcPy“ Gaukite pasirinkto įrašo lauko vertę

„ArcPy“ Gaukite pasirinkto įrašo lauko vertę


Kuriu scenarijų, kad užpildyčiau lauką vienoje funkcijų klasėje, remdamasis kitos funkcijų klasės lauku. Pirmiausia turiu nuomos sluoksnį, kuris yra mažas daugiakampis. Tada turiu indekso tinklelio sluoksnį, kuris yra dideli daugiakampiai. Noriu sužinoti, kurios nuomos sutartys yra kuriame indekso tinklelio daugiakampyje. Indekso tinklelio sluoksnyje yra laukas „Id“, ir aš noriu, kad indekso tinklelio, kuriame yra kiekviena nuoma, vertė Id būtų įrašyta į naują nuomos sluoksnio stulpelį.

Pvz., Indekso tinklelio daugiakampyje, kurio „Id“ yra „7“, yra nuomos sutartys „14“ 6 “ir„ 12 “. Galutinis rezultatas turėtų būti stulpelis, kuriame visų nuomos 14, 6 ir 12 vertė yra„ 7 “. naujame stulpelyje.

Štai ką aš turiu iki šiol:

importuoti arcpy, sys grid = arcpy.GetParameterAsText (0) leasing = arcpy.GetParameterAsText (1) workspace = arcpy.GetParameterAsText (2) new_field = arcpy.GetParameterAsText (3) if arcpy.ListFields ( arcpy.AddError ("Klaida: laukas jau yra")) arcpy.AddField_management (leasing, new_field, 'SHORT', ",", ") grid_lyr = arcpy.MakeFeatureLayer_management (grid, 'grid_lyr') leasing_lyr = arcpy.MakeFeatureLayer_man , 'leasing_lyr') laukai = ['file', new_field] su arcpy.da.UpdateCursor (leasing_lyr, laukai) kaip cur: eilutei cur: leasing = row [0] where = '"file" = ' {}  ". format (leasing) arcpy.SelectLayerByAttribute_management (leasing_lyr, 'NEW_SELECTION', kur) arcpy.SelectLayerByLocation_management (grid_lyr, 'CONTAINS', leasing_lyr) map_no = # Manau, kad čia nėra visos eilutės [1] = map_. „updateRow“ (eilutė)

Vertė „map_no“ reiškia indekso tinklelio ID, kuriam priklauso nuoma.

Kadangi mano kode yra komentaras, manau, kad trūksta tik vienos eilutės ... pradiniame scenarijuje, iš kurio jis gautas, ši eilutė naudoja „arcpy.GetCount_management“, bet akivaizdu, kad tai turi būti kažkas kita. Tai tiesiog turi būti kažkokia „get value“ funkcija, bet aš paprasčiausiai to negaliu suprasti.

Šį darbą išvedžiau iš scenarijaus, kuriame suskaičiuojamas taškų skaičius daugiakampyje, o tada parašoma ta vertė į naują daugiakampio sluoksnio stulpelį. Aš tai pamenu, nes galbūt yra geresnis sprendimas.

„ArcMap 10.1“ naudojimas.


Darant prielaidą, kad ne visuose tinkleliuose yra nuomos sutartys, o tinkleliuose visiškai yra nuomos sutarčių. Jei bus naudojami visi tinkleliai, nereikia kurti funkcijų klasės „in_memory“. Jei kai kurie nuomos sutampa tinkleliai, gausite tik paskutinę tinklelio ID vertę.

importuoti arcpy, sys grid = arcpy.GetParameterAsText (0) leasing = arcpy.GetParameterAsText (1) workspace = arcpy.GetParameterAsText (2) new_field = arcpy.GetParameterAsText (3) if arcpy.ListFields ( arcpy.AddError ("Klaida: laukas jau yra")) arcpy.AddField_management (leasing, new_field, 'SHORT', ",", ") grid_lyr = arcpy.MakeFeatureLayer_management (grid, 'grid_lyr') leasing_lyr = arcpy.MakeFeatureLayer_man , 'leasing_lyr') laukai = ['file', new_field] arcpy.SelectLayerByLocation_management (grid_lyr, "CONTAINS", leasing_lyr) arcpy.FeatureClassToFeatureClass_conversion (grid_lyr, "in_memory", "gridsWithLids" "gridsWithLids" „MakeFeatureLayer_management“ (gridsWithLeases, 'gridLease_lyr') su arcpy.da.SearchCursor ('gridLease_lyr', ['ID']) kaip gridCursor: gridRow in gridCursor: arcpy.SelectLayerByLocation_management ('leasing_ease__lease_ease_lease_ease_lease_ease_lease_ease_lease_lyly " da.UpdateCursor (leasing_lyr, laukai) kaip rentalCursor: le aseRow in rentalCursor: rentalRow [1] = gridRow [0] rentalCursor.updateRow (rentalRow)

Sprendimas yra naudoti erdvinio sujungimo (analizės) įrankį.

Naudokite indekso tinklelį kaip tikslinę funkciją, o nuomą - kaip prisijungimo funkciją. Įveskite išvesties funkcijų klasę. Pasirinkite santykį vienas iš daugelio. Prisijungimo tipas - išsaugokite visus. Palikite laukų žemėlapį tokį, koks yra, arba pašalinkite nereikalingus laukus (būtina išsaugoti tikindekso tinklelio ID'lauke nes tai bus galutinis rezultatas). Galiausiai pasirinkite prisijungimo operatorių „CONTAINS“.

Aukščiau pateikta nuoroda taip pat parodo, kaip pasiekti šį įrankį naudojant arcpy, jei norite.