Menambahkan shapefile atau kelas fitur sebagai lapisan di ArcGIS Desktop menggunakan Python / ArcPy?

20

Saya mencoba mengotomatiskan berbagai tugas di ArcGIS Desktop (menggunakan ArcMap secara umum) dengan Python, dan saya tetap membutuhkan cara untuk menambahkan shapefile ke peta saat ini. (Dan kemudian melakukan hal itu, tapi itu cerita lain).

Yang terbaik yang bisa saya lakukan sejauh ini adalah menambahkan file layer ke peta saat ini, menggunakan yang berikut ("addLayer" adalah objek file layer):

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

Namun, data mentah saya akan selalu berupa shapefile, jadi saya harus dapat membukanya. (Sama: mengonversi shapefile ke file layer tanpa membukanya, tapi saya lebih suka tidak melakukannya).

Tom W
sumber

Jawaban:

30

Inilah yang saya temukan berhasil:

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

Kerangka data (variabel df) yang akan dimasukkan kode ini ke lapisan baru adalah kerangka data pertama dalam dokumen peta. Perhatikan juga bahwa kode ini menambahkan data sebagai layer baru di bagian bawah TOC. Anda juga dapat menggunakan opsi pengaturan lain, yaitu "AUTO_ARRANGE" dan "TOP".

Kenton W
sumber
2
Opsi lain untuk menentukan kerangka data adalah dengan menggunakan kerangka data aktif: df = mxd.activeDataFrame alih-alih df = arcpy.mapping.ListDataFrames (mxd) [0] - juga, Anda tidak memerlukan "*" dalam panggilan listdataframe .
jbalk
10

Make Layer Fitur (Manajemen Data) http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000006p000000.htm

Saya baru saja mencobanya di jendela Python ArcMap dan itu menambahkan langsung ke peta saya (saya tidak harus mendapatkan dataframe saya dan memanggil AddLayer).

arcpy.MakeFeatureLayer_management('r:/temp/a.shp','test') teks alternatif

Jay Cummins
sumber
Itu bekerja sangat baik di jendela langsung ... tetapi ketika saya mencoba kode yang sama dalam file skrip dan menjalankannya, tidak ada yang terjadi! (Kode berjalan tanpa pesan kesalahan, tetapi tidak ada yang muncul di ToC) Juga, jika saya menghapus layer dari ToC, kemudian mencoba dan menjalankan kode di jendela langsung lagi, saya mendapatkan "kesalahan file sudah ada" jenis kesalahan. Di mana file layer "test" disimpan?
Tom W
Apakah Anda menginstal SP1?
Jason Scheirer
1
@ Tom W: Saya cukup banyak noob dengan python dan arcpy. Tapi saya tidak berpikir file layer dibuat secara fisik. Jika Anda ingin file layer, Anda harus membuatnya dan meneruskan nama layer sebagai parameter: arcpy.SaveToLayerFile_management('test', 'r:/temp/evilmonkey.lyr', 'ABSOLUTE') Jika Anda tidak ingin menyimpan layer dan Anda hanya ingin itu hilang arcpy.Delete_management('test'),.
Jay Cummins
@ Tom W: baca kembali komentar Anda. Apakah Anda mencoba menambahkan lapisan ke ArcMap dari shell python yang terpisah (bukan jendela langsung)? Saya tidak berpikir Anda bisa melakukan itu (tapi saya tidak punya otoritas tentang ini ... mungkin Anda bisa).
Jay Cummins
1
@ Tom W: Saya tahu tentang bug layer itu, itulah sebabnya saya memastikan bahwa SP1 diinstal. Untuk menambahkan layer ke TOC seperti yang Anda gambarkan, Anda memerlukan skrip Anda untuk memiliki layer fitur output turunan dan mengatur nilainya ke nama layer yang Anda buat. Alat GP di ArcMap mencoba untuk melindungi TOC dari lapisan palsu (temp FCs dll) di alat GP sehingga Anda perlu mendefinisikan dalam params alat skrip bahwa lapisan fitur baru Anda akan tetap di TOC ketika selesai. Di mana lapisan tersebut hidup pada disk kemungkinan adalah sumber data FC, sehingga Kelas Fitur bernama sama dengan lapisan pada ruang kerja Anda.
Jason Scheirer