Mehr

Schneiden Sie einen Ordner mit Shapefiles durch einen anderen mit denselben Namensenden

Schneiden Sie einen Ordner mit Shapefiles durch einen anderen mit denselben Namensenden


Ich habe zwei Ordner mit Shapefiles: r'E:SOPolygons' und r'E:SODistricts'

In jedem Ordner habe ich 215 Shapefiles, die mit ähnlichen Namenskonventionen benannt sind: poly_100 oder dist_100. Ich muss die Polygone nach den Bezirken beschneiden, wenn ihre Endziffern gleich sind. Ich bin neu bei Python und ratlos:

#Ordner für abgeschnittene Voronoi-Polygone Voronoi_file = str(maindir) + "/" + "Voronoi_polygons" falls nicht os.path.exists(Voronio_file): os.makedirs(Voronoi_file) env.workspace = r'E:SOPolygons' outputworkspace= Voronoi_file count=0 für fc in arcpy.ListFeatureClasses(): end1 = str(fc[4:]) env.workspace = r'E:SODistrics' für fc in arcpy.ListFeatureClasses(): end2 = str (fc[4:]) if end1==end2: out_name = str((outputworkspace) + "/" + "dis_poly" + str(count)) # Assemble den Ausgabepunktnamen und Pfad arcpy.Clip_analysis(end1, end2, out_name) count = count + 1

Dies sollte es tun. Es nutzt Ihre Namenskonvention und geht davon aus, dass es für jedes "poly_xxx.shp" eine passende "dist_xxx.shp" gibt.

import arcpy import os def getShapefiles(aDir): # Hole alle Dateien im Verzeichnis allfiles = os.listdir(aDir) # Isoliere nur die *.shp-Dateien shpOnly = [f für f in allfiles if (os.path.splitext( f)[1] == ".shp")] return shpOnly def makeDictionary(aFCList): aDict = {} für fc in aFCList: idNumber = fc.split("_")[1] aDict[idNumber] = fc return aDict # Eingabedateien polysDir = r'E:SOPolygons' districtsDir = r'E:SODistricts' # Rechtschreibkorrektur beachten # .shp-Dateien in Listen isolieren polys = getShapefiles(polysDir) districts = getShapefiles(districtsDir) # Erstellen Sie ein Wörterbuch der nach Nummern indizierten Bezirksdateien districtsDictionary = makeDictionary(districts) # Durchlaufen Sie die Clipping-Jobs für p in Polys: pFileName = os.path.split(p)[1] # Falls es Unterstriche im enthaltenden gibt Verzeichnisnamen idNumber = pFileName.split("_")[1] # Ermittelt die Ziffern nach dem "_". clippingFeatures = districtsDictionary[idNumber] # Finde den passenden Bezirk. outName = os.path.splitext(p)[0] + "_clp.shp" # "_clp" anhängen; nimmt shapfiles an, nicht gdb fcs. arcpy.Clip_analysis(p, clippingFeatures, outName) # Clip.

Sie erstellen eine Liste innerhalb derzumLinie:

für fc in arcpy.ListFeatureClasses():

arcpyverwendet die Arbeitsbereichsumgebung, wenn die von Ihnen geänderte Liste zurückgegeben wird. Sie haben auch dieselbe Variable verwendetfcin beiden Schleifen!

Versuche dies:

arcpy.env.workspace = r'E:SOPolygons' myList = arcpy.ListFeatureClasses() für fc in MyList: end1 = str(fc[4:]) arcpy.env.workspace = r'E:SO Districs' myList2 = arcpy.ListFeatureClasses() für fc2 in MyList2: # do clip

So würde ich es machen. Es ist ungetestet, sollte aber funktionieren. Der Code durchläuft die Liste der Feature-Classes aus beiden Verzeichnissen und sucht nach Dateien in beiden Verzeichnissen, die nach dem Unterstrich die gleichen Ziffern aufweisen:

import arcpy, os clippeeDir = r'E:SOPolygons' clipperDir = r'E:SODistrics' outDir = r'E:SOVoronio_file' arcpy.env.worksapce = clippeeDir für c1 in arcpy.ListFeatureClasses (): print c1 clippeeFile,clippeecCode = c1.split('_') arcpy.env.workspace = clipperDir für c2 in arcpy.ListFeatureClasses(): clipperFile,clipperCode = c2.split('_') if clippeecCode == clipperCode : clippee = os.path.join(clipperDir,clipperFile) clipper = os.path.join(clipperDir,clipperFile) outFile = os.path.join(outDir,file+code+'_clip') arcpy.Clip_analysis(clipper,clipper, outDatei)