أكثر

ما هي الطريقة الأكثر فعالية لتكرار عمليات المعالجة الجيولوجية من خلال جدول البيانات الجدولية؟

ما هي الطريقة الأكثر فعالية لتكرار عمليات المعالجة الجيولوجية من خلال جدول البيانات الجدولية؟


أرغب في حساب النسبة المئوية لطبقة البيانات النقطية المقطوعة لملف الشكل تتكون من مضلعات متداخلة ، نظرًا لأن ArcGIS لا يدعم منطقة الجدولة للمعالم المتداخلة ، لذلك استخدمت حلقة لمعالجة كل من هذه المعالم المتداخلة واحدة تلو الأخرى:

1: قم بإنشاء ملف شكل مستقل لكل مضلع من جدول البيانات الجدولية

2: قص الطبقة النقطية باستخدام المضلع الفردي الذي تم إنشاؤه من الخطوة 1.

3: احسب النسبة المئوية للشبكة النقطية عن طريق حساب أعداد الشبكات النقطية في كل فئة.

لقد تمكنت من ترميز هذا ، وكان البرنامج النصي يعمل بشكل جيد ولكن ببطء لمجموعة بيانات كبيرة. أقوم بتشغيل هذه الحلقة لأكثر من 2000 مضلعات كبيرة متداخلة واستغرق الأمر ساعات. حاولت تحسين هذا الحساب من خلال:

1: استخدم arcpy.da.SearchCursor بدلاً من arcpy.SearchCursor 2: استخدام مساحة العمل في الذاكرة لتخزين الملفات المعتدلة. 3: استخدام المعالجة المتوازية: arcpy.env.parallelProcessingFactor = "100٪"

هذه كلها مفيدة ولكن ما زلت أعتقد أنه يمكن أن تتحسن أكثر. أفكر في استخدام أداة المعالجة المتوازية بيثون مثل وظيفة الخريطة. هل يمكن لأي شخص أن يقترح كيفية تطبيق وظيفة الخريطة في عملية الحلقة هذه؟

فيما يلي هيكل النص الخاص بي:

featureClass = "E: /ArcGIS/access_to_recreation/new.gdb/Portland_ME_service_2hr" rows = arcpy.da.SearchCursor (featureClass، ['FacilityID']) # تكرار جدول السمات للصف في الصفوف: id = row [0] # Extract كل صف كطبقة مضلع مستقلة في جميع أنحاء الجدول inputfc = "E: /ArcGIS/access_to_recreation/new.gdb/Portland_ME_service_2hr" outputfc = "in_memory  feature" # تحرير هنا! اسم الحقل = "معرف المنشأة" fieldvalue = id # إنشاء جملة where عن طريق استدعاء وظيفة المساعد where_clause = buildWhereClause (inputfc ، fieldname ، fieldvalue) # execute حدد التحليل ، أنشئ طبقات منفصلة arcpy.Select_analysis (inputfc ، outputfc ، where_clause) # # Clip the البيانات النقطية باستخدام كل مضلع inRaster = "E: /ArcGIS/PAD/For_Recreational.gdb/PAD_Parks_continental_final" inMaskData = "in_memory  feature" # تحرير هنا! # Execute ExtractByMask outExtractByMask = ExtractByMask (inRaster، inMaskData) outExtractByMask.save ("in_memory  extract_mask.img") # إنشاء جدول السمات النقطية ، جرب: arcpy.BuildRasterAttributeTable_management ("in_memory.g" extract_management ("، Overmemrite." extract_mask_) 0 ، 1 بكسل في إخراج القناع raster_rows = arcpy.da.SearchCursor ("in_memory  extract_mask.img"، ['OID'، 'Value'، 'Count']) جرب: لـ ra_row في raster_rows: if ra_row [ 0] == 0: blank = ra_row [2] else: value = ra_row [2] النسبة المئوية = 100 * float (value) / (float (blank) + float (value)) باستثناء: النسبة المئوية = 0 Percentage.append (النسبة المئوية ) ID_list.append (id) # حذف الملفات الوسيطة arcpy.Delete_management ("in_memory")

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

للصفوف في الصفوف: # Execute ExtractByMask outExtractByMask = ExtractByMask (inRaster، row.getValue (shapefieldname)) outExtractByMask.save ("in_memory  extract_mask.img")

لو أفهم سؤالك بشكل صحيح ، قد يكون سير العمل التالي بديلاً.

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

ثم أعد تصنيف النقاط النقطية إلى شبكة ثنائية تحتوي على أصفار (ما تشير إليه على أنه "فارغ") وكل شيء آخر يحتوي على تلك ("قيمة" الحقل الخاص بك).

قم بإنشاء برنامج نصي وتشغيل وظيفة "إحصائيات المنطقة كجدول" مع كل مجموعة من مجموعات المضلعات الخاصة بك وسلسلة الجداول. ستحتوي الجداول الناتجة على العدد الإجمالي للخلايا داخل كل منطقة ومجموع القيم التي ستكون عدد الخلايا التي تحتوي على حدائق. من هناك يجب أن يكون من السهل حساب النسبة المئوية.

إحصائيات المنطقة سريعة البرق في الإصدارات الحالية من ArcGIS.


شاهد الفيديو: 005 المعالجة المسبقة للبيانات