พื้นฐานถ้า / จากนั้นใน Python Parser ของเครื่องคำนวณภาคสนามของ ArcGIS?


18

ฉันใช้ ArcGIS 10.2 สำหรับเดสก์ท็อปและฉันได้ดูเว็บไซต์นี้แล้วและยังไม่สามารถหาคำตอบได้ ใหม่มากสำหรับ VBA และ Python แต่ใช้เวลาหลายปีกับ ArcGIS ฉันรู้ว่าฉันสามารถทำสิ่งนี้ได้อย่างช้าๆด้วย Select By Attributes แต่ใช้เวลานาน

ฉันกำลังพยายามเชื่อมต่อเชิงพื้นที่ระหว่างกรณีของโรค (จุดเลเยอร์) และทางเดินสำรวจสำมะโนประชากรของสหรัฐ (ชั้นรูปหลายเหลี่ยม) ต้องใช้ข้อมูลการนับ สำหรับแต่ละจุด / กรณีฉันมีเขตข้อมูลที่เรียกว่าปีกับช่วงวันที่ 2001 ถึง 2012 ขึ้นอยู่กับสิ่งที่เกิดขึ้น ฉันต้องการคอลัมน์การนับสำหรับแต่ละปี ตัวอย่างเช่นคนแรกที่ฉันโทรมา COUNT01 หากวันที่กรณีในปีคือ 2001 แล้ว COUNT01 จะมี 1 ในนั้น หากเป็นปีอื่น (2545-2555) จะต้องมีค่า 0 ฉันจะมีคอลัมน์ COUNT02, COUNT03 ... COUNT12 ไม่สามารถมีค่า "Null"

นี่คือสิ่งที่ฉันได้ลองไปแล้ว

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

และนี่คือข้อมูลที่ดูเหมือนในอาร์ค

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


3
ฉันแนะนำให้คุณใช้ Python และแก้ไขคำถามของคุณเพื่อแทนที่vbaและvbscriptแท็กด้วยpythonแท็ก แม้ว่าจะไม่ได้หายไปเลยVBScript อยู่ในขั้นตอนของการถูกเลิกใช้ ฉันคาดหวังว่ามันจะทำกับ Parser Python ได้ง่ายเมื่อคุณให้รายละเอียดเพิ่มเติมซึ่งรวมถึงรูปภาพ / ตารางของแถวตัวอย่างบางแถวที่แสดงอินพุตจริงและเอาต์พุตที่คาดหวัง YEAR เป็นเขตข้อมูลวันที่หรือเขตข้อมูลจำนวนเต็มที่มีค่าที่สอดคล้องกับปีหรือไม่
PolyGeo

ขอบคุณสำหรับคำแนะนำและความช่วยเหลือ ฉันเพิ่มรูปภาพของตารางแอตทริบิวต์แล้ว ตัวแปรอินพุต YEAR ถูกเก็บไว้เป็น Double (แยกออกจากวันที่ SAS) และคอลัมน์ตัวแปรเอาต์พุต Counts01 ถูกเก็บเป็น Short Integer
BenW

1
มีคุณพิจารณาโดยใช้สถิติสรุปกับปีที่เป็นเขตข้อมูลกรณีของคุณ? ที่ควรให้ COUNT คุณในแต่ละปีโดยไม่จำเป็นต้องใช้ Python หรือ Field Calculator
PolyGeo

ขอบคุณสำหรับคำแนะนำ. ฉันได้พิจารณาสถิติสรุปแล้ว แต่เป้าหมายสุดท้ายคือการนับรายปีต่อสถานที่สำรวจสำมะโนประชากร 1,249 แห่งซึ่งฉันสามารถคำนวณอัตราการเกิดเฉลี่ยต่อปีและ 10 ปีต่อ 100k สถานที่สำรวจสำมะโนประชากรบางแห่งไม่มีกรณีบางแห่งมีตัน แต่ฉันต้องการให้รวมไว้ทั้งหมด แม้กระทั่งการสรุปผืนดินโดยปี 278 ละเว้นจากสถานที่เหล่านั้นไม่มีกรณี
BenW

คำตอบ:


38

ฉันคิดว่านี่คือสิ่งที่คุณต้องการ .... การใช้ python คุณสามารถทำสิ่งต่อไปนี้ (สมมติว่าฟิลด์ YEAR และ COUNT0X เป็นจำนวนเต็ม)

  • เปลี่ยนเป็น Python ตามไฮไลต์ด้านล่าง
  • เพิ่มรหัสลงในกล่องอินพุต 'ลอจิกพื้นฐาน'
  • เปลี่ยน yearVal ตามต้องการสำหรับแต่ละฟิลด์ที่คุณคำนวณ (Count01 จะใช้ 2001, Count02 จะใช้ 2002 และอื่น ๆ )

หมายเหตุ Python ใช้การเยื้องเพื่อแยกรหัสเพื่อให้แน่ใจว่าการเว้นวรรคนั้นถูกต้อง

def myCalc(year,yearVal):
  if (year == yearVal):
    return 1
  else:
    return 0

นี้


3
@BenW - หากวิธีนี้แก้ไขปัญหาของคุณได้โปรดทำเครื่องหมายนี่เป็นคำตอบ (ช่องทำเครื่องหมายภายใต้การนับคะแนนคำตอบ)
ชาดคูเปอร์

จะทำอย่างไรถ้าฉันต้องการตรวจสอบค่าสตริงในคำสั่ง if สิ่งที่มีตัวอักษรเน้นเสียง?
greyline

จะทำอย่างไรถ้าฟิลด์นั้นอยู่ในประเภทอื่นเช่น text, double, etc?
khaliff

@khaliff คุณสามารถแทรกฟังก์ชั่นการแปลงบางประเภทในไพ ธ อนตัวอย่างif (int(year) == yearVal): หรืออื่น ๆ (ดู: informit.com/articles/article.aspx?p=459269&seqNum=7 )
gisnside

ขอขอบคุณ. คุณมีลิงค์ที่ฉันสามารถหาได้เมื่อไหร่ที่จะใช้ myCalc, myFunc, Reclass และอื่น ๆ ?
khaliff

8

คำตอบนี้เป็นหลักเช่นเดียวกับที่ระบุไว้ข้างต้น แต่เป็นวิธีที่ไม่จำเป็นต้องใช้การบล็อกรหัส ... สำหรับเขตข้อมูล Count01 คุณจะตั้งค่าตัวแยกวิเคราะห์เป็น Python แล้วตั้งค่าการคำนวณของคุณเป็น

1 if !YEAR! == 2001 else 0

วิธีการอ่านนี้คือ: ตั้งค่าเขตข้อมูลเป็น 1 ถ้าเขตข้อมูลปีคือ 2001 ถ้าไม่ใช่ 2001 จากนั้นตั้งค่าเป็น 0 ...

หากคุณมีหลายเงื่อนไขหากคุณสามารถซ้อนเงื่อนไขที่ 2 (และต่อมา) "ถ้า" ในคำสั่ง else เช่นนี้ ...

1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else 0)

วิธีการอ่านนี้คือ: ตั้งค่าเขตข้อมูลเป็น 1 ถ้าเขตข้อมูลปีคือ 2001 ถ้าไม่ใช่ 2001 จากนั้นตั้งค่าเป็น 2 ถ้าเป็น 2002 ถ้าไม่ใช่ให้ตั้งเป็น 0 ...


ฉันจะแก้ไขการคำนวณนี้ได้อย่างไรถ้าฉันมีมากกว่าหนึ่งเงื่อนไขฉันหมายถึงราวกับว่าเรากำลังใช้ "elif"
khaliff

หากคุณมีมากกว่าหนึ่งเงื่อนไขคุณสามารถซ้อนเงื่อนไขที่ 2 (และถัดไป) "ถ้า" ในคำสั่งอื่น ... ดังนั้นคุณอาจจะจบลงด้วยบางสิ่งเช่นนี้ ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
Jason Miller

6

หากคุณกำลังจะใช้ VBScript การคำนวณฟิลด์ของคุณนั้นผิด ประการแรกฉันจะไม่ใช้ตัวแปรซึ่งเป็นชื่อของเขตข้อมูลนี้ทำให้เกิดความสับสนให้ใช้ชื่ออื่นเพื่อให้ชัดเจนว่าคุณกำลังตั้งค่าอะไร "endif" ของคุณผิดควรเป็น "end if" และรหัสของคุณควรอยู่ในส่วนของสคริปต์ล่วงหน้า วิธีการตั้งค่าที่ถูกต้องแสดงอยู่ด้านล่าง แต่อย่างที่คนอื่น ๆ ได้พูดไว้อย่าพยายามใช้ VBScript เนื่องจาก ESRI รู้สึกแย่กับการกำจัด Python

การใช้งานเครื่องคิดเลขที่ถูกต้อง


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