Using ArcGIS 10.3 for desktop.
For our noxious weed surveys, we have some features recorded as polygons, some as lines, and some as points. I would like to convert everything to points, and then merge it all into one feature class for each species. I have minimal python experience, but am willing to try.
It is currently set up so that there are three file geodatabases. NoxiousWeeds_points.gdb, NoxiousWeeds_poly.gdb, and NoxiousWeeds_lines.gdb. Within each geodatabase is a separate feature class for each species. E.g., "HimalayanBlackberry_points" or "ReedCanarygrass_poly," etc. Names are consistent between the three geodatabases, the only thing that varies is the suffix.
What I'm Trying to Do:
I would like to be able to simply point arc to the three geodatabases and have it automatically convert the line and polygon feature classes to points, then merge with the matching point feature class based on the name, and then saved to a fourth, separate geodatabase with a slightly modified name. For example, "Knotweed_poly" and "knotweed_line" would both be converted to points, merged with the existing "knotweed_points," and then saved as "Knotweed_merged" in a fourth, separate geodatabase named "NoxiousWeeds_merged." Ideally I could simply point arc to the geodatabases that contain all these files and it would go through this whole process for each species by itself without me having to manually select each file. Note that I would also like the original source files to remain unaltered.
I suspect this is possible through some combination of python and ModelBuilder. If so, how would you recommend I go about it?
-
Definitely possible...I'd see how much of this post you can follow first and then coming back here if you have a more specific questions or it's not working: gis.stackexchange.com/questions/108113/…brokev03– brokev032015年08月13日 00:38:17 +00:00Commented Aug 13, 2015 at 0:38
-
What do you expect as output when you convert your polys and lines to points? Centroids, vertices...?user2856– user28562015年08月13日 01:12:59 +00:00Commented Aug 13, 2015 at 1:12
-
try 'spatial join' your line, point and polygon features with features having new names and attributes, without converting their geometry into points.Ghori– Ghori2015年08月13日 09:51:26 +00:00Commented Aug 13, 2015 at 9:51
1 Answer 1
I suggest populating a python dictionary. The key would be your category, and the values would be a python list of your feature classes to merge. Use a for loop to iterate through your geodatabases, and another to iterate through your feature classes. Check each feature class to determine if it contains points. If not, perform a Feature To Point
conversion. Something like this (untested):
#-Locals
#List of GDBs
gdbs = [r"c:\test\NoxiousWeeds_points.gdb",
r"c:\test\NoxiousWeeds_poly.gdb",
r"c:\test\NoxiousWeeds_lines.gdb"]
#Merge GDB
mergeGdb = r"c:\test\NoxiousWeeds_merged.gdb"
#Workspace
#Use "in_memory" or workspace geodatabase on disk
workspace = "in_memory"
#-End Locals
#Import modules
from arcpy import *
import os
#dictionary to be populated with list of all feature classes
fcsDi = {}
#Garbage for deleting created feature classes
garbage = []
#Iterate through three GDBs
for gdb in gdbs:
print "Iterating", gdb
#Set workspace to GDB
env.workspace = gdb
#List feature classes in gdb
fcs = ListFeatureClasses ()
#Iterate through feature classes
for fc in fcs:
#Check if feature class is points
shape = Describe (fc).shapeType
if shape != "Point":
#Feature to point
outFile = os.path.join (workspace, fc + "_point")
FeatureToPoint_management (fc, outFile, "INSIDE")
garbage += [outFile]
else:
outFile = os.path.join (gdb, fc)
#Remove unwanted text to determine merge
fcCategory = fc.replace ("_poly", "").replace ("_lines", "").replace ("_points", "")
#Check if category is in dictionary
if fcCategory in fcsDi:
fcsDi [fcCategory] += [outFile]
#If not in dictionary
else:
fcsDi [fcCategory] = [outFile]
#Iterate through dictionary keys
for category in fcsDi:
print "Merging", category
#Path to merge feature class
outFc = os.path.join (mergeGdb, category + "_merged")
#Get list of feature classes from dictionary
fcs = fcsDi [category]
#Merge
print "Created:", outFc
Merge_management (fcs, outFc)
#Clean up
for trash in garbage:
Delete_management (trash)
-
Holy moly! I owe you a beer! I'll try this out tomorrow at work and report back! Thank you! One more component that would be nice to have...do you think there's any easy way for a script/model to merge ONLY new/changed values into an existing _merged.gdb? So, it would take only the values in the regular gdb's that had been changed/added since the the merged.gdb was created/last merged...and then merge those changes - overwriting values in the corresponding _merged feature classes that had changed/adding values that were brand new? We do use editor tracking, if that helps.Tim Miller– Tim Miller2015年08月14日 01:17:20 +00:00Commented Aug 14, 2015 at 1:17
-
I hope it works for you! Let us know if you have any issues. It sounds like you have a second question, so that should be addressed in a new post.Emil Brundage– Emil Brundage2015年08月14日 15:34:13 +00:00Commented Aug 14, 2015 at 15:34
-
Do you know if this script would automatically overwrite any feature classes already in the database if they share a name?Tim Miller– Tim Miller2015年08月14日 19:30:08 +00:00Commented Aug 14, 2015 at 19:30
-
That's an environmental setting.
arcpy.env.overwriteOutput = True
. Setting this variable to true will copy over existing data when procedures such as CopyFeatures_management or FeatureClassToFeatureClass_management are performed.Emil Brundage– Emil Brundage2015年08月14日 20:02:35 +00:00Commented Aug 14, 2015 at 20:02 -
Thanks! Where would I put this? Near the beginning of the script, not indented?Tim Miller– Tim Miller2015年08月14日 21:26:59 +00:00Commented Aug 14, 2015 at 21:26
Explore related questions
See similar questions with these tags.