Thêm shapefile hoặc lớp tính năng dưới dạng lớp trong ArcGIS Desktop bằng Python / ArcPy?


20

Tôi đang cố gắng tự động hóa các tác vụ khác nhau trong ArcGIS Desktop (nói chung là sử dụng ArcMap) với Python và tôi tiếp tục cần một cách để thêm một shapefile vào bản đồ hiện tại. (Và sau đó làm mọi thứ với nó, nhưng đó là một câu chuyện khác).

Điều tốt nhất tôi có thể làm cho đến nay là thêm một tệp lớp vào bản đồ hiện tại, sử dụng thông tin sau ("addLayer" là một đối tượng tệp lớp):

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

Tuy nhiên, dữ liệu thô của tôi luôn luôn là shapefiles, vì vậy tôi cần có thể mở chúng. (Tương đương: chuyển đổi một shapefile thành một tệp lớp mà không cần mở nó, nhưng tôi không muốn làm điều đó).

Câu trả lời:


30

Đây là những gì tôi tìm thấy làm việc:

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")

Khung dữ liệu (biến df) mà mã này sẽ đặt lớp mới vào là khung dữ liệu đầu tiên trong tài liệu bản đồ. Cũng lưu ý rằng mã này thêm dữ liệu dưới dạng một lớp mới ở dưới cùng của TOC. Bạn cũng có thể sử dụng các tùy chọn sắp xếp khác, đó là "AUTO_ARRANGE" và "TOP".


2
Một tùy chọn khác để chỉ định khung dữ liệu là sử dụng khung dữ liệu hoạt động: df = mxd.activeDataFrame thay vì df = arcpy.micking.ListDataFrames (mxd) [0] - đồng thời, bạn không cần "*" trong danh sách lệnh listdataframe .
jbalk

10

Tạo lớp tính năng (Quản lý dữ liệu) http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000006p000000.htmlm

Tôi vừa thử nó trong cửa sổ Python của ArcMap và nó thêm trực tiếp vào bản đồ của tôi (tôi không phải lấy khung dữ liệu của mình và gọi AddLayer).

arcpy.MakeFeatureLayer_management('r:/temp/a.shp','test') văn bản thay thế


Điều đó hoạt động rất tốt trong cửa sổ ngay lập tức ... nhưng khi tôi thử cùng một mã trong tệp tập lệnh và chạy nó, không có gì xảy ra! (Mã chạy không có thông báo lỗi, nhưng không có gì xuất hiện trong ToC) Ngoài ra, nếu tôi xóa lớp khỏi ToC, sau đó thử và chạy lại mã trong cửa sổ ngay lập tức, tôi gặp lỗi loại "tệp đã tồn tại". Tập tin lớp "thử nghiệm" được lưu ở đâu?
Tom W

Bạn đã cài đặt SP1?
Jason Scheirer

1
@Tom W: Tôi khá là một người mới với python và arcpy. Nhưng tôi không nghĩ rằng một tập tin lớp được tạo ra. Nếu bạn muốn một tệp lớp, bạn phải tạo nó và chuyển tên lớp làm tham số: arcpy.SaveToLayerFile_management('test', 'r:/temp/evilmonkey.lyr', 'ABSOLUTE') Nếu bạn không muốn lưu lớp đó và bạn chỉ muốn nó biến mất , arcpy.Delete_management('test').
Jay Cummins

@Tom W: chỉ cần đọc lại bình luận của bạn. Bạn đang cố gắng thêm một lớp vào ArcMap từ một vỏ python riêng biệt (không phải cửa sổ ngay lập tức)? Tôi không nghĩ bạn có thể làm điều đó (nhưng tôi không có thẩm quyền về điều này ... có lẽ bạn có thể).
Jay Cummins

1
@Tom W: Tôi biết về lỗi lớp đó, đó là lý do tại sao tôi chắc chắn rằng SP1 đã được cài đặt. Để thêm lớp vào TOC như bạn mô tả, bạn cần tập lệnh của mình có lớp tính năng đầu ra dẫn xuất và đặt giá trị thành tên của lớp bạn đã tạo. Các công cụ GP trong ArcMap cố gắng bảo vệ TOC khỏi các lớp giả (temp FCs, v.v.) trong các công cụ GP, do đó bạn cần xác định trong các thông số của công cụ tập lệnh rằng lớp tính năng mới của bạn sẽ ở lại TOC khi hoàn tất. Trường hợp lớp đang sống trên đĩa có khả năng là nguồn dữ liệu của FC, do đó, Lớp Tính năng có tên giống như lớp trên không gian làm việc của bạn.
Jason Scheirer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.