ArcGIS Python komut dosyası aracı için açılır kutuda katmanın tam yolunu mu seçiyorsunuz?


11

ArcGIS'de Python script tabanlı bir aracım var. Aracın parametrelerinden biri, (araç kutusundaki aracın özelliklerini kullanarak) bir Raster Katmanı olarak ayarladığım bir giriş raster dosyasıdır. Bu, aracı yürüttüğümde, şu anda yüklü olan raster katmanlarının açılır listesinden veya dosya sisteminde yeni bir raster katmanı bulmak için gezinerek bu parametreyi seçme seçeneğine sahip olduğum anlamına gelir.

Daha sonra arcpy.GetParameterAsText(0)benim Python betiğe parametre almak için standart kodu kullanıyorum . Dosya sistemine göz atarak bir dosya seçtiğimde bu iyi çalışıyor, çünkü iletişim kutusundaki metin dosyanın tam yoludur, ancak açılır listeden seçtiğimde geri aldığım metin sadece dosya adıdır (örn. file.tif) .

Çalıştığım kodun dosyanın tam yolunu bilmesi gerekiyor - bunu nasıl alabilirim?

Dosyanın her zaman çalışma alanında olduğunu varsayabilirim, o zaman dosya adını ekleyebilirim arcpy.env.workspace, ancak bunu kabul edemem. Aynı ada sahip bir tane bulana kadar yüklenen tüm katmanları yinelemeli ve ardından tam yolunu bulamam veya daha kolay bir yolu var mı?


3
Açılır listeden seçtiğiniz şeyin, TO'nuzdan (dosya adıyla aynı olan) bir katman adı olduğunu düşünüyorum. Bir fikir olarak, bu katman adını bulmak için ListLayers üzerinden yineleyebilirsiniz ve bir kez bulduğunuzda workpacePath ve datasetName özelliklerini birleştirmek için dataSource özelliğine erişebilirsiniz.
PolyGeo

Neden tam yola ihtiyacınız var? Sorunun bu önemli kısmı, birinin etrafındaki bir çalışma ile sorunuzu yanıtlamasına yardımcı olabilir.
Michael Markieta

@MichaelMarkieta: Python betiğimde (arcpy'nin sağladığı her şeyin dışında) tamamen ayrı bir kitaplık kullanan ve işlenmesi için girdi dosyasının tam yolunu gerektiren bazı kodlar çalıştırıyorum.
robintw

Yanıtlar:


13

Aynı sorunu bir süre önce de yaşadım. Oldukça kolay bir düzeltme, sadece açıklama aracını kullanın.

Katman adını parametrelerinizden zaten alıyorsunuz. Tek yapmanız gereken katmanı tanımlamak, yolu bulmak ve ikisini birleştirmektir.

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
path = desc.path
layersource = str(path) + "/" + layer

Hiç sorun değil.

Bu yardımcı olur umarım


1
İçindekiler'deki Katman adı Feature Class ile aynı değilse, yukarıdaki örnekte desc.name kullanmanız gerektiğini unutmayın.
Sethdd

Katmanın tam yol olup olmadığını bilmediğiniz durumdan ne haber? Benim çözüm de layersource = os.path.join (arcpy.Describe (layer) .path, os.path.basename (layer)) - ayrıca yolun parçalarına katılmak için eğik çizgi kullanma konusunda emin değilim, os.path.join daha fazla buluyorum güvenli ... En üste ithalat os eklemeniz gerekiyor.
Miro

Siz bir cankurtaransınız. Giriş yollarımı değişkenlerle nasıl çalıştıracağımı anlamaya çalışarak son birkaç saattir kafamı bilgisayarımın karşısına atıyorum. Çalıştığım orijinal kod, üzerinde çalıştığım bir proje üzerinde çalıştı, ancak sonra çalıştığım ikinci projede 000732 "yok veya desteklenmiyor" aldım. Kodu Python penceresinde manuel olarak (tam yollarla) test ettim ve çalıştı. Bu çözüm, arcpy.TableToTable_conversion () aracının tam yolunu değişkenlerim ve doğru biçimlendirmeyle geçirmeme izin verdi. Bu çözümü bulmak zordu! Teşekkürler!
Zachary Ordo - GISP

3

Kullanıcının dosya sistemi içinde bir tarama belirtebilme olasılığını hesaba katmak istiyorsanız:

from os.path import split, join
layer = arcpy.GetParameterAsText(0)

#Check if there is a path on the input parameter. If not, prepend the path.
if not split(layer)[0]:
    layer = join(arcpy.Describe(layer).path, "{}.tif".format(layer))

3

Bunu yapmanın biraz daha kısa bir yolu var. veri nesnelerinin tanımlanması dosyanın tam yolu olan bir catalogPath özelliği vardır.

Kullandığımız 10.1 sürümü ile şunları yapabilirsiniz:

layer = arcpy.GetParameterAsText(0)
desc = arcpy.Describe(layer)
layersource = desc.catalogPath

2

Sen kullanabilirsiniz arcpy.GetParameter(0)ziyade arcpy.GetParameterAsText(0)bu katman adı ile sadece bir dize yerine katmanı nesnesi alacak olarak.

Bir katman nesnesi elde edebiliyorsanız, Layerözellikleri doğrudan alabilir ve a Describe.

Böyle bir şey size istediğinizi sağlayabilir:

import arcpy, os

lyr = arcpy.GetParameter(0)

# Check this is a Layer Object
if hasattr(lyr, "dataSource"): 
    arcpy.AddMessage("Datasource = {}".format(lyr.dataSource))
    filepath = lyr.dataSource
else:
    arcpy.AddMessage("Datasource = {}".format(str(lyr)))
    filepath = str(lyr)

0

İşte sonunda kullandım. Mucizevi şekilde çalışır.

lyr = arcpy.mapping.ListLayers(mxd)[0]
desc = arcpy.Describe(lyr)
layersource = desc.catalogPath
print layersource
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.