Daha çox

ArcPy Seçilmiş Qeyd üçün Alanın Dəyərini Alın


Başqa bir xüsusiyyət sinifindəki sahəyə əsaslanaraq bir xüsusiyyət sinifində bir sahəni doldurmaq üçün bir skript qururam. Əvvəlcə hamısı çoxbucaqlı olan icarə qatına sahibəm. Sonra böyük çoxbucaqlı bir indeks ızgara təbəqəsi var. Hansı indeks şəbəkəsi çoxbucağı daxilində hansı icarələrin mövcud olduğunu bilmək istəyirəm. İndeks ızgarası qatında "İd" sahəsi var və mən hər icarə daxilində olan indeks ızgarasından Id dəyərinin icarə qatında yeni bir sütuna yazılmasını istəyirəm.

Məsələn, '7' olan 'Id' olan indeks ızgara çoxbucağı '14 '6' və '12' kirayələrini ehtiva edir. Son nəticə, 14, 6 və 12 kirayələrinin hamısının '7' dəyərinə sahib olduğu bir sütun olmalıdır. yeni sütunda.

İndiyə qədər sahib olduğum şey:

idxal arcpy, sys grid = arcpy.GetParameterAsText (0) leases = arcpy.GetParameterAsText (1) workspace = arcpy.GetParameterAsText (2) new_field = arcpy.GetParameterAsText (3) if arcpy.ListF (arcpy.ListF) arcpy.AddError ("Xəta: Sahə Onsuz da mövcuddur")) arcpy.AddField_management (icarələr, new_field, 'SHORT', ",", ") grid_lyr = arcpy.MakeFeatureLayer_management (grid, 'grid_lyr') leases_lyr_ lecay (arspy.Adr) , 'leases_lyr') fields = ['file', new_field] with arcpy.da.UpdateCursor (leases_lyr, fields) as cur: for line in cur: leases = row [0] where = '"file" = ' {}  ". format (icarəyə verilir) arcpy.SelectLayerByAttribute_management (leases_lyr, 'NEW_SELECTION', burada) arcpy.SelectLayerByLocation_management (grid_lyr, 'CONTAINS', leases_lyr) map_no = # Hesab edirəm ki, bunların hamısı eksikdir [1] updateRow (sıra)

'Map_no' dəyəri, icarəyə aid olan indeks ızgarası İdini təmsil edir.

Kodumda bir şərh olduğuna görə, əskik bir sətir olduğunu düşünürəm ... orijinal ssenaridə bu sətir arcpy.GetCount_management istifadə edir, lakin açıq şəkildə fərqli bir şey olması lazım olduğunu söyləyirəm. Sadəcə bir növ almaq dəyəri funksiyası olmalıdır, amma bunu anlaya bilmirəm.

Bu işi indiyə qədər bir çoxbucaqdakı nöqtələrin sayını hesablayan və sonra bu dəyəri çoxbucaqlı qatdakı yeni bir sütuna yazan bir ssenaridən götürdüm. Bunu qeyd edirəm, çünki bəlkə də daha yaxşı bir həll yolu var.

ArcMap 10.1 istifadə.


Bütün şəbəkələrin icarə içermədiyini və şəbəkələrin tamamilə icarə ehtiva etdiyini düşünmək. Bütün ızgaralardan istifadə ediləcəyi təqdirdə "in_memory" xüsusiyyət sinifinə ehtiyac yoxdur. Bəzi icarələr şəbəkələri üst-üstə düşürsə, yalnız son şəbəkə id dəyərini əldə edəcəksiniz.

idxal arcpy, sys grid = arcpy.GetParameterAsText (0) leases = arcpy.GetParameterAsText (1) workspace = arcpy.GetParameterAsText (2) new_field = arcpy.GetParameterAsText (3) if arcpy.ListF (arcpy.ListF) arcpy.AddError ("Xəta: Sahə Onsuz da mövcuddur")) arcpy.AddField_management (icarələr, new_field, 'SHORT', ",", ") grid_lyr = arcpy.MakeFeatureLayer_management (grid, 'grid_lyr') leases_lyr_ lecay (arspy.Adr) , 'leases_lyr') fields = ['file', new_field] arcpy.SelectLayerByLocation_management (grid_lyr, "CONTAINS", leases_lyr) arcpy.FeatureClassToFeatureClass_conversion (grid_lyr, "in_memory", "gridsWords" gridsWords ") MakeFeatureLayer_management (gridsWithLeases, 'gridLease_lyr') ilə arcpy.da.SearchCursor ('gridLease_lyr', ['ID']) gridCursor kimi: gridRow in gridCursor: arcpy.SelectLayerByLocation_management ". da.UpdateCursor (leases_lyr, sahələr) leaseCursor kimi: le üçün aseRow in leaseCursor: leaseRow [1] = gridRow [0] leaseCursor.updateRow (leaseRow)

Çözüm, Məkan Birləşdirmə (Analiz) Aracı istifadə etməkdir.

İndeks ızgarasını hədəf xüsusiyyəti və icarə şərtlərini qoşulma xüsusiyyəti kimi istifadə edin. Çıxış xüsusiyyət sinifinə daxil olun. Birdən çox münasibətə birini seçin. Qoşulma növü - hamısını saxlayın. Sahə xəritələşdirməsini olduğu kimi buraxın və ya lazımsız sahələri silin (yalnız 'index grid id'sahə çünki bu son nəticə olacaqdır). Nəhayət, qoşulma operatorunu 'QEYDİYYAT' seçin.

Yuxarıdakı link, istənildiyi təqdirdə arcpy istifadə edərək bu alətin necə əldə ediləcəyini də göstərir.


Videoya baxın: Learn How to Perform Statistical Spatial Data Analysis with R and ArcGIS (Oktyabr 2021).