ทำไมการใช้เลเยอร์คุณลักษณะใน ModelBuilder จึงเป็นสิ่งสำคัญ


9

ฉันพยายามที่จะเข้าใจการสร้างกระบวนการทางภูมิศาสตร์ด้วย ModelBuilder แต่ฉันไม่รู้ว่าทำไมการใช้เลเยอร์คุณลักษณะแทนการเรียนคุณลักษณะเมื่อสร้างกระบวนการทางภูมิศาสตร์ด้วย ModelBuilder ใครช่วยอธิบายหน่อยได้ไหม


คำตอบ:


4

ตัวแบบอาจมีชั้นเอาท์พุทกระบวนการย่อยมากมายขึ้นอยู่กับขนาดและความซับซ้อน เพื่อกำจัดไฟล์ที่เขียนลงบนฮาร์ดดิสก์ของคุณเครื่องมือบางอย่างทำให้คุณใช้คุณสมบัติเลเยอร์ (เช่นการเลือกคุณลักษณะซ้ำหรือเลือกตามคุณสมบัติ ) เลเยอร์คุณลักษณะเป็นแบบชั่วคราวและจะไม่คงอยู่หลังจากแบบจำลองของคุณสิ้นสุดลง

ดูที่การสร้างเลเยอร์คุณลักษณะ


9

มีเหตุผลสองประการที่คุณต้องการอ้างอิงคุณลักษณะเลเยอร์ใน ModelBuilder ซึ่งตรงข้ามกับคุณลักษณะคลาส ก่อนอื่นจะช่วยให้เข้าใจความแตกต่าง

  • "คลาสของคุณลักษณะ" เป็นการอ้างอิงถึงข้อมูลดิบอย่างครบถ้วน ตัวอย่างง่ายๆอย่างหนึ่งของสิ่งนี้โดยที่ FC คือ shapefile บนดิสก์
  • "เลเยอร์คุณสมบัติ" เป็นการอ้างอิงถึงการย่อของข้อมูลซึ่งคุณสามารถโต้ตอบกับหนึ่งหรือหลายฟีเจอร์ในชุดข้อมูลดิบ (ซึ่งตรงข้ามกับชุดข้อมูลทั้งหมด) เลเยอร์คือสิ่งที่คุณโต้ตอบอย่างมีประสิทธิภาพเมื่อคุณโหลดข้อมูลลงใน ArcMap แล้ว

ต่อไปนี้เป็นเหตุผลบางประการที่คุณต้องการใช้เครื่องมือ "ทำให้คุณสมบัติของเลเยอร์" เป็นสิ่งที่เกิดขึ้นจากข้อมูลดิบและเครื่องมือประมวลผลทางภูมิศาสตร์อื่น ๆ

  1. เครื่องมือ GP หลายตัวใน ModelBuilder จำเป็นต้องใช้เลเยอร์และจะไม่ยอมรับ FC เป็นอินพุต นี่เป็นเรื่องจริงหากเครื่องมือ GP ของคุณต้องเลือกข้อมูล ในสถานการณ์นี้คุณต้องโต้ตอบกับ LAYER ไม่ใช่ข้อมูลดิบ ตัวอย่าง: หากคุณไม่ได้เปิด ArcMap (หรือโปรแกรม GIS อื่น) วิธีที่คุณจะเลือกคุณสมบัติจากรูปร่างไฟล์ดิบ ... คุณไม่สามารถ คุณต้องโต้ตอบกับเลเยอร์ใน ArcMap เพื่อทำการเลือก
  2. หากคุณต้องการเรียกใช้แบบจำลองจาก ArcCatalog หรือส่งออกแบบจำลองของคุณไปยังสคริปต์ Python ที่สามารถเรียกใช้นอก ArcGIS คุณต้องใช้ "เลเยอร์คุณสมบัติ" เพื่อให้แปลงแหล่งข้อมูลดิบของคุณเป็น "เลเยอร์" สิ่งนี้จะคล้ายคลึงกับ "การเพิ่มข้อมูล" ในเซสชัน ArcMap ของคุณ

  3. การใช้เลเยอร์ทำให้ง่ายต่อการเซ็ตย่อยข้อมูลของคุณเมื่อคุณดำเนินการตามกระบวนการ ModelBuilder สมมติว่าคุณต้องการประมวลผลข้อมูลทั้งหมดด้วยแอตทริบิวต์ "A" ด้วยวิธีหนึ่ง แต่ข้อมูลทั้งหมดที่มีแอตทริบิวต์ "B" ด้วยวิธีอื่น คุณสามารถอ้างอิงข้อมูลดิบของคุณหนึ่งครั้งจากนั้นแยกข้อมูลออกเป็นสอง "กิ่ง" โดยใช้คุณลักษณะเลเยอร์และประมวลผลแต่ละชุดอย่างอิสระ แต่มีผลต่อ / อัปเดตชุดข้อมูลแหล่งเดียว

  4. คุณสามารถสร้างเลเยอร์คุณลักษณะ "in_memory" ที่เป็นการประมวลผลข้อมูลชั่วคราว "bins" และสามารถประมวลผลข้อมูลได้รวดเร็วกว่าการเขียนลงดิสก์หลังจากการดำเนินการทุกครั้ง นอกจากนี้ยัง จำกัด ปริมาณขยะที่คุณต้องล้างข้อมูลหลังจากประมวลผลเสร็จ

ขอบคุณมาก Ryan คำตอบของคุณสมบูรณ์และชัดเจนมาก
Diego Pardo

7

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

การทำงานหลายอย่างใน ArcGIS ต้องการเลเยอร์ชั่วคราวเป็นอินพุต ตัวอย่างเช่นเลือกเลเยอร์ตามตำแหน่ง (การจัดการข้อมูล)เป็นเครื่องมือที่ทรงพลังและมีประโยชน์มากที่ช่วยให้คุณเลือกคุณลักษณะของเลเยอร์ที่แบ่งปันความสัมพันธ์เชิงพื้นที่กับคุณสมบัติการเลือกอื่น คุณสามารถระบุความสัมพันธ์ที่ซับซ้อนเช่น "HAVE_THEIR_CENTER_IN" หรือ "BOUNDARY_TOUCHES" ฯลฯ

แก้ไข:

ด้วยความอยากรู้อยากเห็นและอธิบายถึงความแตกต่างของการประมวลผลโดยใช้เลเยอร์คุณลักษณะและเวิร์กสเปซ in_memory ให้พิจารณาการทดสอบความเร็วต่อไปนี้โดยที่ 39,000 คะแนนถูกบัฟเฟอร์ 100m:

import arcpy, time
from arcpy import env

# Set overwrite
arcpy.env.overwriteOutput = 1

# Parameters
input_features = r'C:\temp\39000points.shp'
output_features = r'C:\temp\temp.shp'

###########################
# Method 1 Buffer a feature class and write to disk
StartTime = time.clock()
arcpy.Buffer_analysis(input_features,output_features, "100 Feet")
EndTime = time.clock()
print "Method 1 finished in %s seconds" % (EndTime - StartTime)
time.sleep(5)

############################
# Method 2 Buffer a feature class and write in_memory
StartTime = time.clock()
arcpy.Buffer_analysis(input_features, "in_memory/temp", "100 Feet")
EndTime = time.clock()
print "Method 2 finished in %s seconds" % (EndTime - StartTime)
time.sleep(5)

############################
# Method 3 Make a feature layer, buffer then write to in_memory
StartTime = time.clock()
arcpy.MakeFeatureLayer_management(input_features, "out_layer")
arcpy.Buffer_analysis("out_layer", "in_memory/temp", "100 Feet")
EndTime = time.clock()
print "Method 3 finished in %s seconds" % (EndTime - StartTime)
time.sleep(5)

ป้อนคำอธิบายรูปภาพที่นี่


เราสามารถเห็นได้ว่าวิธีที่ 2 และ 3 นั้นเทียบเท่าและเร็วกว่าวิธีที่ 1 ประมาณ 3 เท่าซึ่งแสดงให้เห็นถึงพลังของการใช้เลเยอร์คุณลักษณะเป็นขั้นตอนกลางในเวิร์กโฟลว์ขนาดใหญ่


สิ่งนี้ดูเหมือนจะทำให้เกิดสองสิ่ง (ข้อมูลในหน่วยความจำและเลเยอร์คุณลักษณะ) พวกเขาไม่เหมือนกัน ข้อมูลที่เขียนไปยังin_memoryพื้นที่ทำงานยังคงเป็นข้อมูล (เช่นคลาสของคุณลักษณะและตาราง) ยังคงใช้พื้นที่ (อาจมีจำนวนมาก) ในทางกลับกันคุณลักษณะเลเยอร์เป็นมุมมองของข้อมูลช่วยให้คุณสามารถเลือกชุดย่อยของข้อมูลและใช้ในกระบวนการที่ตามมาแทนที่จะเป็นข้อมูลที่ซ้ำกันเพียงเพื่อให้ได้ชุดย่อยของมัน เลเยอร์คุณลักษณะใช้พื้นที่เกือบจะไม่มีเลย ฉันชอบคิดว่าพวกเขาเป็น "ตัวชี้ที่มีข้อมูลเมตา" เช่นพวกเขาชี้ไปที่ข้อมูลบางส่วนและอธิบายถึงวิธีการสืบค้น / แสดงผล
blah238

เพียงเพื่อเพิ่มความคิดเห็นก่อนหน้าของฉันฉันได้อ่านที่ไหนสักแห่งในเว็บไซต์นี้ว่าin-memoryพื้นที่ทำงานนั้นเป็นฐานข้อมูลไฟล์ที่อยู่ในหน่วยความจำหากคุณต้องการคิดแบบนั้น
blah238

เช่นเดียวกับฐานข้อมูลไฟล์ทางภูมิศาสตร์ แต่พื้นที่รูปร่างจะไม่ถูกคำนวณเมื่อ in_memory - จะให้ลิงก์ไปยังสิ่งนี้ในภายหลัง
PolyGeo

ในตัวอย่างที่สองที่อัปเดตของคุณคุณกำลังสร้างคลาสคุณลักษณะในหน่วยความจำไม่ใช่เลเยอร์คุณลักษณะ
blah238

2
ไม่นานมานี้ แต่นี่คือลิงค์ที่ฉันสัญญาไว้เมื่อ 6 เดือนที่แล้ว
PolyGeo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.