2016-04-04 7 views
1

У меня проблема, когда я пытаюсь скопировать классы объектов в базу геоданных. Я просматриваю все классы объектов в папке и копирую только классы объектов многоугольника. Моя проблема в том, что когда я копирую первый класс объектов многоугольника, он переименовывает его «shp», а затем пытается также называть второй «shp». Переменная fcname возвращает полные имена классов объектов ('counties.shp' и 'new_mexico.shp') вне функции копирования, но она не работает должным образом внутри функции.Pyrhon переменная, работающая вне функции, но не внутри

В приведенном ниже коде есть функция, которую я хочу запустить, для проверки переменной fcname. В папке есть пять классов объектов, причем два из них являются классами многоугольников. При раскомментировании код проходит весь путь через первый класс объектов многоугольника, где fcname приводит к «shp» вместо «counties.shp». Он делает то же самое для второго класса объектов, что приводит к ошибке, поскольку «shp» уже существует в gdb.

import arcpy 

# Set initial variables with different pathnames available 
# whether I am working on my home or work computer 

pathhome = "G:/ESRIScriptArcGIS/Python/Data/Exercise06" 
pathwork = "C:/ESRIPress/Python/Data/Exercise06" 
arcpy.env.workspace = pathwork 
gdbname ="NewDatabase.gdb" 

fclist = arcpy.ListFeatureClasses() 

# Create new gdb 
##arcpy.management.CreateFileGDB(path, gdbname) 
newgdb = path + "/" + gdbname 

# Loop through list 
for fc in fclist: 
    desc = arcpy.Describe(fc) 
    fcname = desc.name 
    outpath = newgdb + "/" + fcname 

    # Check for polygon then copy 
    if desc.shapeType == "Polygon": 
     ##arcpy.management.CopyFeatures(fcname,outpath) 
     ##print fcname + "copied." 
     print fcname 
    else: 
     print "Not a polygon feature class" 

Спасибо всем, кто может помочь!

+0

Просто убедитесь, что я понял - 'fcname' является идеальным файлом в коде, который вы отправили, но как только он переходит в' CopyFeatures', он усекается? Или что-то другое? –

+0

Он был усечен до просто shp. –

ответ

1

Возможно, в вашем коде имеется ошибка. Однако я вижу более очевидную ошибку в вашем подходе.

Если ваша цель - отфильтровать классы по форме, вы можете использовать аргумент feature_type, принятый функцией arcpy.ListFeatureClasses().

Смотрите документацию: http://pro.arcgis.com/en/pro-app/arcpy/functions/listfeatureclasses.htm

Вам не нужно использовать для цикла любой больше, чтобы фильтровать данные.

2

Я нашел ответ на проблему. CopyFeatures не хочет полного пути к файлу в аргументе out_feature_class. Я удалил «.shp» с конца пути файла, и он сработал.

Я также принял совет Гектора и отфильтрован только до полигонов в аргументах ListFeatureClasses, однако мне все еще нужен цикл, чтобы пройти через результирующий список и скопировать каждый класс объектов.

Вот результат, который сработал.

import arcpy 

# Set initial variables with different pathnames available 
# whether I am working on my home or work computer 

pathhome = "G:/ESRIScriptArcGIS/Python/Data/Exercise06" 
pathwork = "C:/ESRIPress/Python/Data/Exercise06" 
arcpy.env.workspace = pathwork 
gdbname ="NewDatabase.gdb" 

fclist = arcpy.ListFeatureClasses("", "Polygon") 

# Create new gdb 
arcpy.management.CreateFileGDB(pathwork, gdbname) 
newgdb = pathwork + "/" + gdbname 

# Loop through list 
for fc in fclist: 
    desc = arcpy.Describe(fc) 
    fcname = str(desc.name) 
    outpath = newgdb + "/" + fcname.replace(".shp","") 



    arcpy.management.CopyFeatures(fcname,outpath) 
    print fcname + " has been copied." 

 Смежные вопросы

  • Нет связанных вопросов^_^