การเพิ่มรูปร่างไฟล์หรือคลาสคุณลักษณะเป็นเลเยอร์ใน ArcGIS Desktop โดยใช้ Python / ArcPy?


20

ฉันพยายามทำให้งานต่าง ๆ ใน ArcGIS Desktop (โดยทั่วไปใช้ ArcMap) กับ Python และฉันต้องการวิธีเพิ่ม Shapefile ลงในแผนที่ปัจจุบัน (แล้วทำสิ่งต่าง ๆ ให้มัน แต่นั่นเป็นอีกเรื่อง)

สิ่งที่ดีที่สุดที่ฉันทำได้คือเพิ่มไฟล์เลเยอร์ลงในแผนที่ปัจจุบันโดยใช้สิ่งต่อไปนี้ ("addLayer" เป็นวัตถุไฟล์เลเยอร์):

def AddLayerFromLayerFile(addLayer):
 import arcpy
 mxd = arcpy.mapping.MapDocument("CURRENT")
 df = arcpy.mapping.ListDataFrames(mxd, "Layers")[0]
 arcpy.mapping.AddLayer(df, addLayer, "AUTO_ARRANGE")
 arcpy.RefreshActiveView()
 arcpy.RefreshTOC()
 del mxd, df, addLayer

อย่างไรก็ตามข้อมูลดิบของฉันจะเป็นไฟล์รูปร่างเสมอดังนั้นฉันจึงต้องสามารถเปิดได้ (เท่ากับ: แปลง Shapefile เป็นไฟล์เลเยอร์โดยไม่ต้องเปิด แต่ฉันไม่ต้องการทำเช่นนั้น)

คำตอบ:


30

นี่คือสิ่งที่ฉันพบว่าทำงานได้:

import arcpy
from arcpy import env

# get the map document
mxd = arcpy.mapping.MapDocument("CURRENT")

# get the data frame
df = arcpy.mapping.ListDataFrames(mxd,"*")[0]

# create a new layer
newlayer = arcpy.mapping.Layer(path_to_shapefile_or_feature_class)

# add the layer to the map at the bottom of the TOC in data frame 0
arcpy.mapping.AddLayer(df, newlayer,"BOTTOM")

dataframe (ตัวแปร df) ที่โค้ดนี้จะนำเลเยอร์ใหม่เข้าไปเป็นดาต้าเฟรมแรกในเอกสารแผนที่ โปรดทราบว่ารหัสนี้เพิ่มข้อมูลเป็นเลเยอร์ใหม่ที่ด้านล่างของ TOC คุณสามารถใช้ตัวเลือกการจัดเรียงอื่น ๆ ซึ่งก็คือ "AUTO_ARRANGE" และ "TOP"


2
ตัวเลือกอื่นสำหรับการระบุดาต้าเฟรมคือการใช้ดาต้าเฟรมที่ใช้งานอยู่: df = mxd.activeDataFrame แทน df = arcpy.mapping.ListDataFrames (mxd) [0] - นอกจากนี้คุณไม่จำเป็นต้องใช้ "*" ในการเรียก listdataframe .
jbalk

10

ทำให้เลเยอร์คุณสมบัติ (การจัดการข้อมูล) http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000006p000000.htm

ฉันเพิ่งลองใช้งานในหน้าต่าง Python ของ ArcMap และเพิ่มลงในแผนที่ของฉันโดยตรง (ฉันไม่จำเป็นต้องรับ dataframe ของฉันและโทร AddLayer)

arcpy.MakeFeatureLayer_management('r:/temp/a.shp','test') ข้อความแสดงแทน


มันใช้งานได้ดีในหน้าต่างทันที ... แต่เมื่อฉันลองรหัสเดียวกันในไฟล์สคริปต์และเรียกใช้มันไม่มีอะไรเกิดขึ้น! (รหัสทำงานโดยไม่มีข้อความแสดงข้อผิดพลาด แต่ไม่มีสิ่งใดปรากฏใน ToC) นอกจากนี้หากฉันลบเลเยอร์ออกจาก ToC จากนั้นลองเรียกใช้รหัสในหน้าต่างทันทีอีกครั้งฉันได้รับข้อผิดพลาดประเภท "ไฟล์มีอยู่แล้ว" ไฟล์เลเยอร์ "test" บันทึกอยู่ที่ไหน
Tom W

คุณติดตั้ง SP1 หรือไม่
Jason Scheirer

1
@ Tom W: ฉันเป็น noob กับงูหลามและ arcpy แต่ฉันไม่คิดว่าไฟล์เลเยอร์ถูกสร้างขึ้นจริง หากคุณต้องการไฟล์ชั้นที่คุณจะต้องทำมันและส่งชื่อชั้นเป็นพารามิเตอร์: หากคุณไม่ต้องการที่จะประหยัดชั้นและคุณก็อยากให้มันหายไปarcpy.SaveToLayerFile_management('test', 'r:/temp/evilmonkey.lyr', 'ABSOLUTE') arcpy.Delete_management('test')
Jay Cummins

@Tom W: เพียงแค่อ่านความคิดเห็นของคุณอีกครั้ง คุณพยายามที่จะเพิ่มเลเยอร์ใน ArcMap จากเชลล์ไพ ธ อนแยกกัน (ไม่ใช่หน้าต่างทันที) หรือไม่? ฉันไม่คิดว่าคุณจะทำได้ (แต่ฉันไม่มีอำนาจในเรื่องนี้ ... บางทีคุณสามารถทำได้)
Jay Cummins

1
@Tom W: ฉันรู้เกี่ยวกับข้อบกพร่องของเลเยอร์นั้นซึ่งเป็นสาเหตุที่ฉันต้องทำให้แน่ใจว่าติดตั้ง SP1 แล้ว ในการเพิ่มเลเยอร์ไปยัง TOC ตามที่คุณอธิบายคุณต้องใช้สคริปต์ของคุณเพื่อรับเลเยอร์คุณลักษณะเอาท์พุทที่ได้รับมาและตั้งค่าเป็นชื่อของเลเยอร์ที่คุณสร้าง เครื่องมือ GP ใน ArcMap พยายามปกป้อง TOC จากเลเยอร์ปลอม (temp FCs และอื่น ๆ ) ในเครื่องมือ GP ดังนั้นคุณจำเป็นต้องกำหนดใน params ของเครื่องมือสคริปต์ที่เลเยอร์คุณลักษณะใหม่ของคุณจะยังคงอยู่ใน TOC เมื่อเสร็จสิ้น ที่ที่เลเยอร์อาศัยอยู่บนดิสก์นั้นน่าจะเป็นแหล่งข้อมูลของ FC ดังนั้น Feature Class จะมีชื่อเหมือนกับเลเยอร์ในเวิร์กสเปซของคุณ
Jason Scheirer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.