Daha çox

ArcMap istifadə edərək atribut cədvəlində ən yaxşı 10 qeydin seçilməsi


ArcMap 10.2-də ModelBuilder-dən istifadə edərək kateqoriyaya və sonra məsafəyə görə sıralanmış ilk 10 qeydləri seçmək üçün bir yol tapmağa çalışdım. Məsələn, masamın 100 kateqoriyası və 100 kilsəsi var ki, bu da "Kateqoriya" sahəsidir və saytımdan "Mesafe" sahəsindəki hər bir qeydə qədər məsafəm var. Əslində ModelBuilder-də bir vasitə istifadə edərək ən yaxın 10 bankı və ən yaxın 10 kilsəni seçib seçilmiş qeydləri ixrac edə bilmək istəyirəm.

Təklifiniz varmı?


Əvvəlki şərhlərdə və yazılarda SearchCursor sintaksisinin köhnəlmiş olması və Desktop 10.1 və ya daha sonrakı versiyanız varsa, məlumat giriş imlecindən 10 qat daha yavaşdır. Yalnız DA imleclərini istifadə edin.

Budur ssenarim, banklarınızın və kilsələrinizin xüsusiyyətlər sinifində eyni sahədə olduğunu düşünsəniz, bu ssenari bütün kateqoriyalar üçün ilk on məhsulu əldə edəcək və ya bu seçimdən istifadə etsəniz yalnız göstərilən kateqoriyalar. Ssenarinin sonu, kateqoriyaya, sonra məsafəyə görə sıralanacaq bütün göstərilən kateqoriyalar üçün ilk 10 maddənin ayrıca bir xüsusiyyət sinfi yaradacaqdır. Bir imleci çeşidləməkdən ən az 10 dəfə daha sürətli işləyir.

print "Script Set Up" import arcpy # İstifadəçi tərəfindən müəyyən edilmiş dəyişənlər # iş yerinizi əvəz edin ws = r "C:  Path  OptionalGDB.gdb" # giriş və çıxış xüsusiyyət siniflərinizi əvəz edin sourceFC = "Feature_Class" outDataset = "Feature_Class_TOP_10s" # substitute kateqoriya və məsafə dəyərləri üçün sahə adlarınız Kateqoriya = "CATEGORY_FIELD" məsafəsi = "DISTANCE FIELD" # İstəyə görə rəyi ikinci sətirdən silin və xüsusi kateqoriyalar siyahısına daxil etmək üçün dəyişdirin categorySet = "# categorySet = Category" IN ('BANKLAR', 'CHURCHES') ) VƏ "### Düzəlişə ehtiyac duyulmayan skript qaydası # İş yerini qurun arcpy.env.workspace = ws # Qeydlərin seçilməsi üçün bir xüsusiyyət qatını düzəldin sourceLayer = sourceFC +" Layer "arcpy.MakeFeatureLayer_management (sourceFC, sourceLayer) # Yaradın burada clause whereclause = categorySet + "OBJECTID> -1" # arcpy bəndinə əsasən qeydləri seçin.SelectLayerByAttribute_management (sourceLayer, "NEW_SELECTION", whereclause) # Kateqoriya siyahısı, daha sonra məsafədən sonra sifariş veriləcək. OBJECTID sahələri = [Bölmə, məsafə, "OID @"] yazdır "Oxu qeydləri" # Hər kateqoriya üçün bir Da SearchCursor-dan xülasə lüğət yaradın. valueDict = {} arcpy.da.SearchCursor ilə (sourceLayer, sahələr) searchRows kimi: searchRow in searchRows: keyValue = searchRow [0] əgər keyValue in valueDict: # sıralanabilir bir sətir siyahısını saxlayan lüğətə yeni bir kateqoriya təyin edin valueDict [ keyValue] = ["% (Cat) s,% (Dist) 031.15f,% (OID) 020.0f"% {'Cat': searchRow [0], 'Dist': searchRow [1], 'OID': searchRow [2]}] başqa: # bir kateqoriya onsuz da lüğətdə olduqda, siyahı dəyərinə əlavə olunurDict [keyValue] .append ("% (Cat) s,% (Dist) 031.15f,% (OID) 020.0f"% { 'Cat': searchRow [0], 'Dist': searchRow [1], 'OID': searchRow [2]}) print "Reading Records Finished" # Build a where blause whereclause = "OBJECTID IN (" sorted for item) (valueDict.keys ()): i = 0 OIDS = "" for OID for sorted (valueDict [item]): OIDS + = str (int (OID.split (",") [2])) + "," whereclause + = str (int (OID.split (",") [2])) + "," i + = 1 if i> = 10: break print str (OID.split (",") [0]) + "OBJECTIDs -" + OIDS [: - 1] print "" whereclause = whereclause [: - 1] + ")" whereclause print # select reco bənd arcpy.SelectLayerByAttribute_management (sourceLayer, "NEW_SELECTION", whereclause) bəndinə əsaslanan rds ### Üst 10 maddənin sıralanmış xüsusiyyət sinfi yaratmaq üçün istəyə uyğun olaraq ### Arcpy.Exists (outDataset) varsa, çıxış cədvəlini silin. : arcpy.Delete_management (outDataset) ### Xüsusiyyətlərin Sifarişini əvvəlcə kateqoriyaya, sonra isə məsafəyə görə təyin edin sort_fields = [[Kateqoriya, "YÜKSƏLƏN"], [Uzaqlıq, "YÜKSƏLƏN"]] ### Çıxış Sıralandı Seçilmiş top 10 Bütün kateqoriyalar arcpy.Sort_management üçün xüsusiyyətlər (sourceLayer, outDataset, sort_fields)

Hər kateqoriyanın ilk 10 maddəsini ayrıca işləmək istəyirsinizsə, skriptin sonunu yenidən düzəldin:

sıralanmış maddə üçün (valueDict.keys ()): i = 0 OIDS = "" # a bəndində bir bənd qurun whereclause = "OBJECTID IN (" üçün OID üçün sorted (valueDict [item]): OIDS + = str (int (OID) .split (",") [2])) + "," wereclause + = str (int (OID.split (",") [2])) + "," i> = 10 əgər i + = 1: break print str (OID.split (",") [0]) + "OBJECTIDs -" + OIDS [: - 1] print "" whereclause = whereclause [: - 1] + ")" print whereclause # select records based on the blause arcpy.SelectLayerByAttribute_management (sourceLayer, "NEW_SELECTION", whereclause) # Bu girinti səviyyəsində cari kateqoriya ilk 10 seçimi ilə bir şey edin

Bunu bir arcpy.SearchCursor (istifadə edərək) həll edə biləcəyimizi düşünürəm.Hələ də Köhnə Məktəb Axtarış Kursorundan istifadə edirəm) və arcpy.Select_analysis () alətinin istifadəsi. Aşağıdakılar yəqin ki, səmərəsizdir, amma ümid edirəm kömək edir. Bu, Banklar və Kilsələr qatının bir File Geodatbase (.gdb) içində tutulduğunu düşünür:

arcpy idxal BanksAndChurches = r'Path  To  BanksAndChurches  FeatureClass 'arcpy.env.workspace = r'Path  To  OutputGDB' closeest_IDs = []

Birincisi, ən yaxşı 10 bankı tutmaq və OID-lərini istədiyiniz çıxış xüsusiyyətləri siyahısına əlavə etmək üçün bir axtarış imlecinə ehtiyacımız var:

cursor = arcpy.SearchCursor (BanksAndChurches, where_clause = "Category =" Banks "", sort_fields = "D məsafəsi D") sayğac = 1 kursordakı sıra üçün: əgər sayğac <= 10: closest_IDs.append (row.getValue ("OID") )) counter + = 1 del sıra del kursor

Sonra Kilsələr üçün eyni şeyi edin:

cursor = arcpy.SearchCursor (BanksAndChurches, where_clause = "Category =" Kilsələr "", sort_fields = "D məsafəsi D") sayğac = 1 kursordakı sıra üçün: əgər sayğac <= 10: closest_IDs.append (row.getValue ("OID") )) counter + = 1 del sıra del kursor

Sonra bu 20 OID siyahısını götürün və bir çıxış sənədinə ən yaxın 10 bankı və ən yaxın 10 kilsəni seçmək üçün istifadə edin:

oid_list_as_string = "close_ID-lərdə olan element üçün: oid_list_as_string + = str (item) oid_list_as_string + = ',' oids = oid_list_as_string [: - 1] arcpy.Select_analysis (BanksAndChurches, env.workspace +"  O20Sites "," + oids + ")")

Ən yaxşı uğurlar.


Budur çılpaq bir nümunə (həm Jim, həm də Richardın cavablarından borc almaq):

import arcpy fc = r'C:  junk  FILE_GDB.gdb  Export_output_gdb '# input xüsusiyyət class field1, field2 =' Distance ',' Type '# field to sort, and group fcOut = r'in_memory  blah' # output feature class # set counters bankcount = 0 churchcount = 0 # start where blause whereclause = "OBJECTID IN (" # sorted in sorted for sıra for sorted (arcpy.da.SearchCursor (fc, [field1, field2, 'OID @'])) ): if sıra [1] == 'Bank': əgər bank hesabı <10: bank hesabı = bank hesabı + 1 # sayğac artırmaq whereclause + = str (sıra [2]) + ',' # satır [1] olduğu təqdirdə haradasa bəndinə əlavə edin == 'Kilsə': əgər Churchcount <10: churchcount = churchcount + 1 # sayğacın sayını artırın + = str (sıra [2]) + ',' # bəndin olduğu yerə əlavə edin # satırın bitdiyi yerdə bəndin whereclause = whereclause [: - 1] + ")" # xüsusiyyət qatını düzəltmək fLayer = 'fLayer' arcpy.MakeFeatureLayer_management (fc, fLayer) # seçim arcpy.SelectLayerByAttribute_management (fLayer, "NEW_SELECTION", whereclause) # arcLayoutFoFeamFoeFeam,