أكثر

تحديد أفضل 10 سجلات في جدول البيانات باستخدام ArcMap

تحديد أفضل 10 سجلات في جدول البيانات باستخدام ArcMap


أنا أستخدم ModelBuilder في ArcMap 10.2 لمحاولة إيجاد طريقة لتحديد أول 10 سجلات مرتبة حسب الفئة ثم حسب المسافة. على سبيل المثال ، تحتوي طاولتي على 100 بنك و 100 كنيسة ، وهو حقل "الفئة" ، ولدي المسافة من موقعي إلى كل سجل مخزن في حقل "المسافة". بشكل أساسي ، أريد أن أكون قادرًا على تحديد أقرب 10 بنوك وأقرب 10 كنائس وتصدير السجلات المحددة ، باستخدام أداة في ModelBuilder.

هل لديك اي اقتراحات؟


صيغة SearchCursor في التعليقات والمنشورات السابقة قديمة وأبطأ 10 مرات من مؤشر الوصول إلى البيانات إذا كان لديك سطح المكتب 10.1 أو أحدث. استخدم مؤشرات DA فقط.

هذا هو النص الخاص بي ، بافتراض أن فئات البنوك والكنائس الخاصة بك موجودة في نفس المجال في فئة الميزات ، سيحصل هذا البرنامج النصي على العناصر العشرة الأولى لجميع الفئات أو الفئات المحددة فقط إذا كنت تستخدم هذا الخيار. ستنشئ نهاية البرنامج النصي فئة ميزة منفصلة لأعلى 10 عناصر لجميع الفئات المحددة التي سيتم فرزها حسب الفئة ثم حسب المسافة. يعمل على الأقل 10 مرات أسرع من فرز المؤشر.

طباعة "إعداد البرنامج النصي" import arcpy # المتغيرات التي يحددها المستخدم # استبدل مساحة العمل الخاصة بك ws = r "C:  Path  OptionalGDB.gdb" # استبدل فئات ميزات الإدخال والإخراج الخاصة بك sourceFC = "Feature_Class" outDataset = "Feature_Class_TOP_10s" # بديلاً أسماء الحقول الخاصة بك للفئة وقيم المسافة الفئة = "CATEGORY_FIELD" المسافة = "DISTANCE FIELD" # اختياريًا قم بإزالة التعليق من السطر الثاني وتعديله لإدراج فئات معينة من الفئة Set = "# categorySet = الفئة" في ('البنوك' ، 'CHURCHES' ) و "### روتين نصي لا يحتاج إلى تعديل # تعيين مساحة العمل arcpy.env.workspace = ws # قم بإنشاء طبقة ميزة لاختيار السجلات sourceLayer = sourceFC +" Layer "arcpy.MakeFeatureLayer_management (sourceFC، sourceLayer) # Build a حيث clause whereeclause = categorySet + "OBJECTID> -1" # حدد السجلات استنادًا إلى جملة where arcpy.SelectLayerByAttribute_management (sourceLayer، "NEW_SELECTION"، whereeclause) # قائمة الحقول يتم ترتيبها حسب الفئة ثم المسافة ثم حقول OBJECTID = [الفئة ، المسافة ، "OID @"] اطبع "قراءة السجلات" # إنشاء قاموس ملخص من مؤشر البحث لكل فئة. valueDict = {} مع arcpy.da.SearchCursor (sourceLayer ، الحقول) مثل searchRows: for searchRow in searchRows: keyValue = searchRow [0] if not keyValue in valueDict: # تعيين فئة جديدة إلى القاموس الذي يخزن قيمة قائمة سلسلة قابلة للفرز ديكت [ keyValue] = ["٪ (Cat) s،٪ (Dist) 031.15f،٪ (OID) 020.0f"٪ {'Cat': searchRow [0]، 'Dist': searchRow [1]، 'OID': searchRow [2]}] else: # عندما تكون الفئة موجودة بالفعل في القاموس ، قم بإلحاق قيمة القائمةDict [keyValue]. append ("٪ (Cat) s،٪ (Dist) 031.15f،٪ (OID) 020.0f"٪ { 'Cat': searchRow [0]، 'Dist': searchRow [1]، 'OID': searchRow [2]}) طباعة "Finished Reading Records" # إنشاء جملة where whereeclause = "OBJECTID IN (" للعنصر في الفرز (valueDict.keys ()): i = 0 OIDS = "" لـ OID في الفرز (valueDict [item]): OIDS + = str (int (OID.split ("،") [2])) + "،" Whereeclause + = str (int (OID.split ("،") [2])) + "،" i + = 1 if i> = 10: فاصل طباعة str (OID.split ("،") [0]) + "OBJECTIDs -" + OIDS [: - 1] اطبع "" whereeclause = whereeclause [: - 1] + ")" print whereeclause # select reco rds استنادًا إلى جملة where arcpy.SelectLayerByAttribute_management (sourceLayer، "NEW_SELECTION"، whereeclause) ### قسم اختياري لإنشاء فئة ميزة مصنفة لأهم 10 عناصر ### حذف جدول الإخراج إذا كان موجودًا إذا كان arcpy موجودًا (outDataset) : arcpy.Delete_management (outDataset) ### تعيين ترتيب الميزات ليكون الأول حسب الفئة ثم حسب المسافة sort_fields = [[Category، "ASCENDING"]، [Distance، "ASCENDING"]] ### Output Sorted Selected أعلى 10 ميزات لجميع الفئات arcpy.Sort_management (sourceLayer ، outDataset ، sort_fields)

إذا كنت ترغب في معالجة أهم 10 عناصر من كل فئة على حدة ، فراجع نهاية البرنامج النصي من أجل:

للعنصر في (valueDict.keys ()): i = 0 OIDS = "" # إنشاء جملة where whereeclause = "OBJECTID IN (" لـ OID في الفرز (valueDict [item]): OIDS + = str (int (OID .split ("،") [2])) + "،" whereeclause + = str (int (OID.split ("،") [2])) + "،" i + = 1 if i> = 10: كسر طباعة str (OID.split ("،") [0]) + "OBJECTIDs -" + OIDS [: - 1] طباعة "" whereeclause =where [: - 1] + ")" print whereeclause # select Record بناءً على the where clause arcpy.SelectLayerByAttribute_management (sourceLayer، "NEW_SELECTION"، whereeclause) # افعل شيئًا باستخدام الفئة الحالية لأعلى 10 تحديدات في مستوى المسافة البادئة هذا

أعتقد أنه يمكننا التعامل مع هذا باستخدام Arcpy.ما زلت أستخدم مؤشر البحث عن المدرسة القديمة) واستخدام أداة arcpy.Select_analysis (). ربما يكون ما يلي غير فعال ولكن آمل أن يساعد. يفترض هذا أن طبقة البنوك والكنائس محفوظة في ملف Geodatbase (.gdb):

استيراد arcpy BanksAndChurches = r'Path  To  BanksAndChurches  FeatureClass 'arcpy.env.workspace = r'Path  To  OutputGDB' أقرب معرفات = []

أولاً ، نحتاج إلى مؤشر بحث للاستيلاء على أقرب 10 بنوك وإضافة معرفات الكائن إلى قائمة ميزات الإخراج المطلوبة:

cursor = arcpy.SearchCursor (BanksAndChurches، where_clause = "Category =" Banks ""، sort_fields = "Distance D") العداد = 1 للصف في المؤشر: if العداد <= 10: Luxor_IDs.append (row.getValue ("OID" )) عداد + = 1 ديل صف دل المؤشر

ثم افعل نفس الشيء مع الكنائس:

cursor = arcpy.SearchCursor (BanksAndChurches، where_clause = "Category =" Churches ""، sort_fields = "Distance D") العداد = 1 للصف في المؤشر: if العداد <= 10: Luxor_IDs.append (row.getValue ("OID" )) عداد + = 1 ديل صف دل المؤشر

ثم خذ هذه القائمة المكونة من 20 معرفًا للكائن واستخدمها لتحديد أقرب 10 بنوك وأقرب 10 كنائس في ملف الإخراج:

oid_list_as_string = "للعنصر في معرّفات الأقرب: oid_list_as_string + = str (عنصر) oid_list_as_string + = '،' oids = oid_list_as_string [: - 1] arcpy.Select_analysis (BanksAndChurches، env.workspace +"  Top20IDSites ("،" + معرفات + ")")

حظا سعيدا مع هذا.


إليك مثال بسيط (استعارة من إجابات كل من جيم وريتشارد):

import arcpy fc = r'C:  junk  FILE_GDB.gdb  Export_output_gdb '# input feature class field1، field2 =' Distance '،' اكتب '# الحقول للفرز ، والمجموعة fcOut = r'in_memory  blah' # خاصية الإخراج class # set up counters bankcount = 0 Churchcount = 0 # start حيث جملة whereeclause = "OBJECTID IN (" # تشغيل من خلال مرتبة للصف في الفرز (arcpy.da.SearchCursor (fc، [field1، field2، 'OID @']) ): if row [1] == 'Bank': if bankcount <10: bankcount = bankcount + 1 # zoom counter whereeclause + = str (row [2]) + '،' # add to where clause if row [1] == 'Church': if churchcount <10: churchcount = Churchcount + 1 # زيادة العداد whereeclause + = str (row [2]) + '،' # add to where clause del row # finish where clause whereeclause = whereeclause [: - 1] + ")" # make feature layer fLayer = 'fLayer' arcpy.MakeFeatureLayer_management (fc، fLayer) # make select arcpy.SelectLayerByAttribute_management (fLayer، "NEW_SELECTION"، whereeclause) # write to output arcpy.CopyFeatures_management (fLayer)