สถิติโซน 2 ทำให้เกิดข้อผิดพลาดร้ายแรง มีทางเลือกอื่นไหม

Aug 19 2020

ฉันเพิ่งเปลี่ยนไปใช้เครื่องมือเสริม "สถิติโซนเป็นตาราง 2" แทน "สถิติโซน" ปกติเพราะฉันมีรูปหลายเหลี่ยมทับซ้อนกันซึ่งสถิติโซนไม่ได้จัดการ อย่างไรก็ตามฉันได้พยายามเรียกใช้สถิติโซน 2 สองสามครั้งในตอนนี้และหลังจากทำงานเป็นเวลาหลายชั่วโมงตลอดทั้งคืนก็พบข้อผิดพลาดร้ายแรงและจะไม่เสร็จสิ้น ฉันไม่แน่ใจว่าจะแก้ไขปัญหานี้อย่างไร ฉันพยายามคำนวณค่าเฉลี่ยระดับความสูงภายในรูปหลายเหลี่ยมบัฟเฟอร์มากกว่า 100,000 รูปและจะต้องทำหลาย ๆ ครั้งกับเลเยอร์แรสเตอร์อื่น ๆ มีทางเลือกอื่นหรือวิธีรับเครื่องมือเพื่อทำตามคำสั่งหรือไม่?

คำตอบ

2 FelixIP Aug 19 2020 at 06:59

ในการแก้ปัญหานี้คุณจะต้องแบ่งรูปหลายเหลี่ยมของคุณออกเป็นกลุ่มโดยไม่ทับซ้อนกัน มันถูกเรียกว่ากราฟสี

เพื่อให้สคริปต์ด้านล่างทำงาน a) ติดตั้งแพ็คเกจnetworkxและ b) รัน:

PolygonNeighbors("POLYGONS", "neighbours", area_overlap="AREA_OVERLAP")

สคริปต์:

'''
creates non-adjacent groups of polygons
'''
import arcpy
import networkx as nx
infc = arcpy.GetParameterAsText(0)
table = arcpy.GetParameterAsText(1)

sourceList=[f.name for f in arcpy.ListFields(table)]
FTO=sourceList[1:3]
fromto=arcpy.da.TableToNumPyArray(table,FTO)
try:arcpy.AddField_management(infc, "COLOR","Short")
except:pass
G=nx.Graph()
G.add_edges_from(fromto)

allGroups=sorted(nx.connected_components(G), key = len, reverse=True)

arcpy.AddMessage("%i connected groups found" %len(allGroups))
D={}
for item in allGroups:
    arcpy.AddMessage(len(item))
    subG=G.subgraph(item)
    d = nx.coloring.greedy_color(subG, strategy=nx.coloring.strategy_largest_first)
    D.update(d)
    with arcpy.da.UpdateCursor(infc,("OID@","COLOR")) as cursor:
        for row in cursor:
            if row[0] not in item:continue
            row[1]=D[row[0]]+1
            cursor.updateRow(row)
arcpy.AddMessage("Done")

จะเพิ่มและเติมช่อง "COLOR" ด้วยตัวเลขในช่วง (1..4) นี่คือช่วงทางทฤษฎีคาดหวังสิ่งที่ใหญ่กว่าขึ้นอยู่กับขอบเขตของการทับซ้อนกัน ฉันจะบอกว่าสถานการณ์ที่เลวร้ายที่สุดคือ 7 สี คุณอาจฮาร์ดโค้ดคลาสคุณสมบัติการป้อนข้อมูล (infc) และตารางแอดเดรส (ตาราง) หากคุณไม่ต้องการกำหนดสคริปต์ให้กับเครื่องมือด้วยพารามิเตอร์ 2 ตัว

โปรดทราบว่าสคริปต์จะข้ามรูปหลายเหลี่ยมเกาะซึ่งจะส่งผลให้ไม่มีค่าหรือ 0 ในฟิลด์ COLOR ขึ้นอยู่กับแหล่งที่มาของคลาสคุณลักษณะ:

คุณมีสองทางเลือกในการดำเนินการต่อ:

  1. กำหนด n เลเยอร์จาก POLYGONS ด้วยตนเองโดยใช้การสืบค้นคำจำกัดความเช่น "COLOR" = 1 เรียกใช้สถิติแบบโซนในแต่ละรายการ รวมผลลัพธ์
  2. เขียนสคริปต์หรือพัฒนาโมเดลเพื่อทำงานข้างต้นโดยอัตโนมัติ

ฉันสงสัยว่านี่คือสิ่งที่สถิติโซน 2 ทำอยู่เบื้องหลังไม่แน่ใจว่าเหตุใดจึงล้มเหลวเว้นแต่คุณจะทำให้ขอบเขตการประมวลผลและการตั้งค่าสภาพแวดล้อมขนาดเซลล์สับสนหรือใช้การคาดการณ์ที่แตกต่างกันในแรสเตอร์และบัฟเฟอร์