Sunday 3 April 2016

arcgis 10.1 - Merge feature classes in feature datasets using ArcPy?


I'm trying to merge a group of like feature classes which are contained within separate feature datasets. I can merge feature classes within a file geodatabase without having issues by creating a list of the feature classes and using Merge_management. The trouble comes when I need to do the same for feature classes contained in feature datasets.


My code so far, looks like:


Output = filepath for new fc
for datasetList1 in arcpy.ListDatasets("","Feature")+ [""]
PointsFC in arcpy.ListFeatureClasses("*_PointName*","Point",datasetList1):
for points in PointsFC:
arcpy.Merge_management(points,Output)
print "Merged Points"


The error message I get states:



PtsMerge already exists. Failed to execute (Merge).




Answer



Here is how I would do it:


import arcpy, os, sys

# set your parameters input and output database

InDB = sys.argv[1]
OutDB = sys.argv[2]

if not os.path.exists(OutDB):
DBpath = os.path.dirname(OutDB)
DBname = os.path.basename(OutDB)
name,ext = os.path.splitext(DBname)
if ext.upper() == ".MDB":
arcpy.AddMessage("Creating output personal database")
arcpy.CreatePersonalGDB_management(DBpath,DBname)

elif ext.upper() == ".GDB":
arcpy.AddMessage("Creating output file database")
arcpy.CreateFileGDB_management(DBpath,DBname)
else:
arcpy.AddError("Unknown output database format")

# set your workspace for ListDatasets
arcpy.env.workspace = InDB

# create empty lists

LineList = list()
PointList = list()
PolyList = list()

# Standalone feature classes
for FeatClass in arcpy.ListFeatureClasses():
desc = arcpy.Describe(InDB + "\\" + FeatClass)
if desc.shapeType == "Point":
PointList.append(InDB + "\\" + FeatClass)
elif desc.shapeType == "Polyline":

LineList.append(InDB + "\\" + FeatClass)
elif desc.shapeType == "Polygon":
PolyList.append(InDB + "\\" + FeatClass)

# iterate through feature datasets
for FC in arcpy.ListDatasets():
arcpy.env.workspace = InDB + "\\" + FC
for FeatClass in arcpy.ListFeatureClasses():
desc = arcpy.Describe(InDB + "\\" + FC + "\\" + FeatClass)
if desc.shapeType == "Point":

PointList.append(InDB + "\\" + FC + "\\" + FeatClass)
elif desc.shapeType == "Polyline":
LineList.append(InDB + "\\" + FC + "\\" + FeatClass)
elif desc.shapeType == "Polygon":
PolyList.append(InDB + "\\" + FC + "\\" + FeatClass)

arcpy.AddMessage("Performing merge")
if len(PointList) > 0:
arcpy.Merge_management(PointList,OutDB + "\\Merged_Points")
if len(LineList) > 0:

arcpy.Merge_management(LineList,OutDB + "\\Merged_Lines")
if len(PolyList) > 0:
arcpy.Merge_management(PolyList,OutDB + "\\Merged_Polygons")

Going through the database first on the root level and then for each feature class build up a list of features separated using the describe properties then merge them all at the end.


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...