Daha çox

Yeni xüsusiyyət yaratmaq üçün ModelBuilder-da təkrarlayıcılardan necə istifadə olunur?

Yeni xüsusiyyət yaratmaq üçün ModelBuilder-da təkrarlayıcılardan necə istifadə olunur?


Mineral icarəyə aid torpaq sahələrinin hazırlanması prosesini avtomatlaşdırmaq üçün ModelBuilder-dən istifadə etməyə çalışıram.

Mövcud icarə xüsusiyyət sinfi, həcm və səhifə kimi istinad sənəd məlumatları ilə əlaqəli məlumatları ehtiva edir.

İcarə şəxsiyyəti və arayış sənədinin həcmi və səhifəsini ehtiva edən yeni icarələrə aid məlumatlarla dolu bir verilənlər bazasından istifadə edirəm.

Planlaşdırdığım yeni icarələrin çoxu artıq çəkilmiş çoxbucaqlara aiddir və eyni sənəd həcminə və səhifəsinə istinad edir.

Etmək istədiyim, verilənlər bazamdakı VOLUME və SƏHİFƏ atributlarına əsasən mövcud icarə xüsusiyyət sinifindən xüsusiyyətləri seçəcək bir model yaratmaq, bu xüsusiyyəti ayrı bir xüsusiyyət sinifinə (xüsusiyyətlərin yükləndiyi redaktə qatına) kopyalamaq / yapışdırmaqdır. icarə verilənlər bazası) və yeni kopyalanan xüsusiyyətin sahələrini verilənlər bazamdan icarə identifikatoru ilə doldurun.

Satır seçiminin təkrarlanmasının ən yaxşı ilk addım ola biləcəyinə inanıram, amma oradan hara gedəcəyimə əmin deyiləm.

Bu, işlədiyim ən mürəkkəb ModelBuilder layihəsidir ki, hər hansı bir məlumat və ya təklif böyük bir kömək ola bilər.


Çözüm uyğun bir axtarış aparmaq üçün bir imleci və lüğəti istifadə edərək pythondur və nəticədə əlavə icarə kimliyi sahəsi ilə orijinal mineral icarəsi ilə eyni xüsusiyyət növünə və məlumat quruluşuna sahib olan boş xüsusiyyət sinifinə bir imleci ilə nəticəni verir. masadan. Baxış üçün kod bu şəkildə inanılmaz dərəcədə sürətli.

Burada yalnız məlumatlarınıza uyğunlaşdırılması lazım olan bəzi kodlar (iş sahəsi, giriş xüsusiyyət sinfi, əlaqəli cədvəl, çıxış xüsusiyyət sinfi və SƏS, səhifə və leaseid sahə adları). Verilərinizin çoxdan çoxa bir əlaqəyə sahib olduğunu düşündüm, burada bir çox bağlamanın eyni SƏVİYYƏ və SƏHİFƏ və bir çox LeaseID-lər eyni SƏVİYYƏ və SƏHİFƏyə sahib ola bilər, belə ki, aralarındakı daha sadə münasibətlə qarşılaşsanız da işləyəcəkdir. iki məlumat mənbəyi. Çıxış masanızda heç bir uyğun LeaseID olmayan xüsusiyyətlər daxil olmaqla bütün Mineral İcarə xüsusiyyətlərini ehtiva edəcək və hər uyğun LeaseID-i tutmaq üçün lazım olan qədər xüsusiyyət yaratmaq üçün bütün uyğun xüsusiyyətlər təkrarlanacaqdır.

Uyğun icarə xüsusiyyətlərinin hamısını tək bir xüsusiyyət sinfinə çıxarmaq istədiyinizi güman etdim, amma həqiqətən hər Səs və Səhifə dəyərləri dəsti üçün yaradılan ayrı xüsusiyyət sinifləri istəyirsinizsə, bunu edə biləcəyim bəzi kiçik kod dəyişiklikləri ilə edilə bilər. təmin etmək. Həm də uyğun LeaseID-ləri olmayan Mineral İcarə xüsusiyyətləri dəstini, həqiqətən istəməsəniz, yaradılmasını ləğv etmək üçün kodu asanlıqla dəyişə bilərəm.

Bu kodu 100.000-dən çox xüsusiyyətə sahib bir xüsusiyyət sinfi və 130.000-dən çox xüsusiyyətə sahib çoxdan çox cədvəldən istifadə edərək öz məlumatlarımda sınadım və istifadə etdiyim iki əlaqəli sahəyə uyğun təxminən 2.074.000 xüsusiyyət istehsal etdim. Bu qədər xüsusiyyəti yaratmaq üçün yalnız 12 dəqiqə 17 saniyə çəkildi (hər 3 saniyədə təxminən 10.000 xüsusiyyət). ModelBuilder iteratoru və təkrarlanan seçilmiş sorğuların istifadəsi eyni şeyi etmək saat və ya gün çəkmiş olardı. Kodum, əlaqəli sahələrin indeksləşdirilməsini tələb etmir (ancaq əlaqəli sahələri indeksləşdirmədən ModelBuilder-də yanaşmağınıza cəsarət etmirsiniz). İki sahəmin bənzərsiz dəyərləri əvəzinə iki məlumat mənbəyi arasında Birə Birə və ya Birdən Çoxa bir əlaqə yaratmış olsaydı, kod təxminən 2 dəqiqə ərzində bitmiş olardı.

Python 2.7 qrupundakı ArcGIS Proqram Qovluqunuzdan Python Idle'yi açın, Yeni bir Fayl açın və bu kodu yeni fayla yapışdırın, sonra sənədin .py uzantısı ilə istədiyiniz adla qeyd edin. Sonra məlumatları uyğunlaşdırmaq üçün girişləri və sahə adlarını dəyişdirin və kodu işlədin.

import datetime def hms_string (sec_elapsed): h = int (sec_elapsed / (60 * 60)) m = int ((sec_elapsed% (60 * 60)) / 60) s = sec_elapsed% 60. return "{}: {:> 02}: {:> 05.2f} ". Format (h, m, s) # End hms_string def timedif (end_datetime, start_datetime): seconds_elapsed = (end_datetime - start_datetime) .total_seconds () return hms_string (seconds_elapsed) # End timedif start_time = datetime.datetime.now () print "Script start: {}". format (start_time) arcpy-dən arcpy import env print "İdxal yükləndi. Keçən vaxt: {}". format (timedif (datetime.datetime.now ()) , start_time)) # --- Verilərinizə uyğunlaşdırmaq üçün dəyişdirməli olduğunuz dəyişənlər --- # Verilənlərinizə uyğun iş sahəsi yolunu özelleştirin, məsələn geodatabase iş sahəsi = r "C:  Users  CRID  Documents  ArcGIS  YourGeodatabase.gdb "env.workspace = iş sahəsi # Bunu xüsusiyyət sinif adınıza uyğunlaşdırmaq üçün fərdiləşdirin (bunun iş yerində olduğunu düşünür) inputFC =" MineralLeasesFC "inputFCFull = iş sahəsi + '' + inputFC çap girişiFCFull # Bunu özünüzə uyğunlaşdırın icarə identifikatoru cədvəli (bunun iş sahəsində olduğunu ehtimal edir) relatedTable = "LeaseIDsTable" relatedTableFull = iş sahəsi + '' + relatedTable print relatedTableFull # İstədiyiniz çıxış adının olması üçün bunu fərdiləşdirin (iş sahəsinə çıxışı nəzərdə tutur) outputFC = "MineralLeasesWithIDs" outputFCFull = iş sahəsi + '' + outputFC çap çıxışıFCFull # Bunu VOLUME, PAGE və LEASEID inVolumeFld = "VOLUME" inPageFld = "PAGE" relatedVolumeFld = "VOLUME" relatedPageFld = "PAGE" leaseIDFld üçün sahə adları adı olaraq özelleştirin. = "LEASEID" çap "Dəyişənlər yükləndi. Keçən vaxt: {} ". Format (timedif (datetime.datetime.now (), start_time)) # --- Dəyişdirməyə ehtiyacınız olmayan kod --- # Çıxışın artıq mövcud olub olmadığını yoxlayın və əgər varsa silin arcpy.Exists (outputFCFull) varsa: arcpy.Delete_management (outputFCFull, "FeatureClass") "Silindi {} yazdırır. Keçən vaxt: {} ". Format (outputFC, timedif (datetime.datetime.now (), start_time)) # giriş arcpy.CreateFeatureclass_management (iş sahəsi, outputFC," POLYGON ", inputFCFull," SAME_AS_TEMPLATE "," SAME_AS_TEMPLATE ", inputFCFull) çap" Yaradıldı {}. Keçən vaxt: {} ". Format (outputFC, timedif (datetime.datetime.now (), start_time)) # LeaseID sahəsi üçün sahə məlumatlarını əldə edin və sahə üçün arcpy.ListFields (relatedTable) sahəsinə əlavə edin. sahələr: əgər field.name.upper () == leaseIDFld.upper (): fldType = field.type fldPrecision = field.precision fldScale = field.scale fldLength = field.length fldAliasName = field.aliasName # LeaseID üçün bir sahə əlavə edin arcpy.AddField_management (outputFCFull, leaseIDFld, fldType, fldPrecision, fldScale, fldLength, fldAliasName) print "Added {} Field. Keçən vaxt: {} ". Format (leaseIDFld, timedif (datetime.datetime.now (), start_time)) # relatedFieldsList = [relatedVolumeFld, relatedPageFld, leaseIDFld] # ilə əlaqəli Cədvəl sahələri siyahısını qurun. əlaqədar cədvəl relatedDict = {} ilə arcpy.da.SearchCursor (relatedTableFull, relatedFieldsList) ilə searchRows kimi: searchRow for searchRows: keyValue = '{}; {}'. format (searchRow [0], searchRow [1]) deyilsə keyValue in relatedDict: relatedDict [keyValue] = [searchRow [2]] else: relatedDict [keyValue] .append (searchRow [2]) del searchRows, searchRow print "Loaded relatedDict from {}. Keçən vaxt: {} ". Format (relatedTable, timedif (datetime.datetime.now (), start_time)) # Giriş və çıxışın düzenlenebilir sahələri üçün bir sahə siyahısı yaradın inputFieldsList = [inVolumeFld, inPageFld] outputFieldsList = [] sahələr = arcpy.ListFields (inputFCFull) sahələrdəki sahə üçün: if field.edible və field.type! = 'Həndəsə': inputFieldsList.append (field.name) outputFieldsList.append (field.name) elif field.type == 'Həndəsə ': inputFieldsList.append ("SHAPE @") outputFieldsList.append ("SHAPE @") outputFieldsList.append (leaseIDFld) print "Sahə siyahısı yaradıldı {}. Keçən vaxt: {} ". Format (inputFC, timedif (datetime.datetime.now (), start_time)) # arcpy.da.SearchCursor (inputFCFull, inputFieldsList) ilə SearchCursor inputDict = {} -dən lüğət düzəldin: searchRowsdakı searchRow üçün: keyValue = '{}; {}'. format (searchRow [0], searchRow [1]) yoxsa keyDalət inputDict: inputDict [keyValue] = [list (searchRow [2:])] başqa: inputDict [keyValue] .append (list (searchRow [2:])) del searchRows, searchRow print "Yüklənmiş inputDict {}. Keçən vaxt: {} ". Format (inputFC, timedif (datetime.datetime.now (), start_time)) counter = 0 cursor = arcpy.da.InsertCursor (outputFCFull, outputFieldsList) key for inputDict: rows = inputDict [key] if açarı ilə bağlıDict: satır sırası üçün: icarə üçün əlaqədarDict [açar]: sayğac + = 1 əgər sayğac% 10000 == 0: çap "İcarə var. Sayaç = {}. Keçən vaxt: {} ". Format (counter, timedif (datetime.datetime.now (), start_time)) relatedRow = list (row) relatedRow.append (lease) cursor.insertRow (relatedRow) else: satırdakı sıra üçün: counter + = 1 əgər counter% 10000 == 0: print "İcarə yoxdur. Sayaç = {}. Keçən vaxt: {} ". Format (counter, timedif (datetime.datetime.now (), start_time)) row.append (None) cursor.insertRow (row) del cursor, inputDict, relatedDict print" Inserted {} Records. Keçən vaxt: {} ". Format (counter, timedif (datetime.datetime.now (), start_time))" Script Finished: {} ". Format (datetime.datetime.now ())

Videoya baxın: Many to Many Relationship Example in Core Part-26