การแก้ไขรูปแบบฉลาก (แบบอักษรสีขนาด ฯลฯ ) โดยใช้ ArcPy?


9

ฉันกำลังพยายามเขียนแมโครไพ ธ อนสำหรับ ArcGIS 10.2 ที่จะทำให้กระบวนการติดฉลากจุดในเลเยอร์โดยอัตโนมัติตามประเภทอพาร์ทเมนต์ต่างๆ ตัวอย่างเช่นอพาร์ทเมนท์หนึ่งรูปแบบจะมีสี่เหลี่ยมสีน้ำเงินพร้อมตัวหนาสีขาวเป็นป้ายกำกับเดียว อีกอันหนึ่งจะมีสี่เหลี่ยมสีชมพูพร้อมตัวหนาสีดำ อีกอันจะมีสี่เหลี่ยมสีแดงที่มีตัวหนาสีขาว ฯลฯ

คุณต้องการใช้นิพจน์หรือฟังก์ชันใน arcpy เพื่อเปลี่ยนสไตล์ของป้ายกำกับเหล่านี้หรือไม่

ขณะนี้สคริปต์ติดป้ายอพาร์ตเมนต์ตามรหัสแผนที่และเปลี่ยนชื่อใน TOC เป็นอพาร์ตเมนต์ตามที่ควร

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

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

แบบอักษรป้ายกำกับและกราฟิกสามารถเปลี่ยนแปลงได้หรือไม่ด้วยการใช้สคริปต์ Python (ArcPy, IDLE ฯลฯ )


ฉันตัดสินใจที่จะแก้ไขโพสต์นี้เพื่อให้คำอธิบายขั้นสุดท้ายเกี่ยวกับสิ่งที่ฉันกำลังจะมาที่นี่จึงไม่มีความสับสน โดยพื้นฐานแล้วจุดบนแผนที่จะเปลี่ยนจากการมองภาพด้านบนเป็นดังนี้:

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


ฉันลองใช้lblClass.expressionฟังก์ชั่นนี้แล้ว แต่รหัสที่ฉันพยายามจะใช้ไม่ทำงาน ฉันคิดว่าน่าจะเป็นขั้นตอนในทิศทางที่ถูกต้อง ด้านล่างเป็นรหัสที่ฉันได้ลองใช้เพื่อรับ labelClass.expression เพื่อเปลี่ยนแบบอักษรของป้ายกำกับ

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])

คำตอบ:


7

arcpy.mapping API ให้การเข้าถึงคุณสมบัติเลเยอร์จำนวน จำกัด เท่านั้นที่สามารถแก้ไขได้โดยตรง แต่คุณสมบัติทั้งหมดที่พบในกล่องโต้ตอบคุณสมบัติเลเยอร์สามารถแก้ไขได้โดยใช้ฟังก์ชัน UpdateLayer ข้อมูลถูกดึงมาจากเลเยอร์ต้นทางและนำไปใช้กับเลเยอร์ในเอกสารแผนที่ที่จำเป็นต้องได้รับการอัปเดต source_layer อาจเป็นไฟล์เลเยอร์ (.lyr) หรือเลเยอร์ภายในเอกสารแผนที่ UpdateLayer เป็นฟังก์ชันที่มีประสิทธิภาพเพราะสามารถใช้งานได้หลายวิธีเพื่อให้ได้ผลลัพธ์ที่แตกต่างกัน

คุณต้องสร้างสัญลักษณ์ / ป้ายกำกับตามที่คุณต้องการและบันทึกลงในไฟล์เลเยอร์ แล้วโหลดไฟล์ที่ชั้นใช้arcpy.mapping.UpdateLayer ()

หากมีหลายคนต้องการเรียกใช้งาน python คุณต้องทำให้ทุกคนสามารถเข้าถึงไฟล์เลเยอร์ได้เช่นไดรฟ์เครือข่ายสาธารณะ


ฉันสิ้นสุดการทำเองปรับปรุงชั้นกล่องคุณสมบัติ อนุญาตให้คุณเลือกเลเยอร์ใน ArcMap TOC จากนั้นเลือกไฟล์เลเยอร์อินพุต จากนั้นอัปเดตเลเยอร์ด้วยคุณสมบัติทั้งหมดภายในไฟล์เลเยอร์แล้วนำกลับมาที่คลาสคุณลักษณะดั้งเดิมอีกครั้ง มันจะทำงานกับข้อมูลที่อยู่ใน gdb, mdb, shp หรือ sde

ดูรหัสที่มา

โปรดแจ้งให้เราทราบหากคุณมีข้อสงสัย

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


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

ฉันจะใช้ฟังก์ชั่นประเภทใดเกี่ยวกับการค้นหาสิ่งนั้น ฉันไม่คุ้นเคยกับการจัดหาซ้ำ ฉันซาบซึ้งในความช่วยเหลือของคุณเท่านี้
Tyler Spears

ฉันพยายามปรับให้เหมาะกับรหัสของฉัน มันทำงานผ่านฟังก์ชั่น UpdateLayer แต่ที่บรรทัดที่ 35: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]มันมีข้อผิดพลาดบอกว่าดัชนีอยู่นอกช่วง
Tyler Spears

นั่นหมายความว่าarcpy.mapping.ListLayersวิธีนี้ไม่ได้ค้นหาเลเยอร์ใน mxd ปัจจุบันที่มีชื่อเดียวกับของคุณinput_layer_file(ดัชนีของการ[0]ส่งคืนดัชนีนอกช่วงหมายความว่าไม่มีรายการในรายการ)
XIY

ฉันทำและฉันรู้สึกว่านี่ใกล้มาก แต่ปัญหาคือหลังจากที่ส่วนของ UpdateLayer เสร็จสิ้นแล้วมันจะพ่นข้อผิดพลาดต่อไปนี้: Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
Tyler Spears

6

อีกตัวเลือกหนึ่งคือการตั้งค่าการแสดงออกของฉลากที่กำหนดเองในชั้น (เปลี่ยนขนาดและสี .. ฯลฯ ) โดยใช้หลาม:

เช่น

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

การแสดงออกของป้ายอาคาร

อาจถูกตั้งค่าผ่าน:

LabelClass (arcpy.mapping)

แก้ไข:

ลองสิ่งนี้:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

คุณสามารถลบข้อความสั่งอื่น ๆ ของคุณ (สำหรับ loop, labClass และ call to function) นอกจากนี้ฟังก์ชั่นจะต้องเรียกว่า FindLabel


ฉันพยายามใช้สิ่งที่คล้ายกับฟังก์ชั่นเช่นนี้ ฉันสร้างคำจำกัดความที่เรียกว่าdef getLabel (Code, Type)และหลังจากตั้งค่าคำสั่ง if-else สำหรับรหัสแผนที่อื่นที่ฉันใช้ฉันก็ตั้งค่า 'lblClass.expression = getLabel ("[Map_Code]", "[Type]") ซึ่งเพิ่งกลับมา ข้อผิดพลาดTypeError: unsupported operand type(s) for &: 'str' and 'str'ฉันตามตัวอย่างเว็บไซต์ของ Esri หากฉันสามารถพิสูจน์ได้ว่าฉันสามารถเปลี่ยนแบบอักษรได้ฉันสามารถไปยังการปรับเปลี่ยนมุมมองที่ยากขึ้น (เช่นรูปร่างพื้นหลังและสีของป้ายกำกับ)
Tyler Spears

@Tyler Spears ลองลบเครื่องหมายคำพูดคู่รอบชื่อฟิลด์
artwork21

เมื่อฉันทำอย่างนั้นมันบอกว่าพารามิเตอร์ไม่ได้กำหนดไว้
Tyler Spears

@Tyler Spears คุณสามารถโพสต์รหัสของคุณในคำถามของคุณ? คุณมีเครื่องหมายอัญประกาศเดี่ยวด้านนอกของวงเล็บฟังก์ชัน
artwork21

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