I want to use the clip function in python, the code is as follow:
import os
from multiprocessing import Pool
import arcpy
from arcpy import env
def data_clip(shp):
env.workspace = r"F:/GCM_CMIP5/FGOALS-g2(LASG-CESS)/mrro/ShpFile/f"
clip_features = "D:/Research/boundry.shp"
pre, suf = os.path.splitext(shp)
new = pre + "_china" + suf
in_mem = os.path.join("in_memory", pre)
out_feature_class = os.path.join("F:/GCM_CMIP5/FGOALS-g2(LASG-CESS)/mrro/ChinaShpFile", new)
arcpy.Clip_analysis(shp, clip_features, in_mem)
arcpy.CopyFeatures_management(in_mem, out_feature_class)
arcpy.DeleteFeatures_management(in_mem)
if __name__ == "__main__":
env.overwriteOutput = True
env.workspace = r"F:/GCM_CMIP5/FGOALS-g2(LASG-CESS)/mrro/ShpFile/f"
p = Pool(7)
fcs = arcpy.ListFeatureClasses()
p.map(data_clip, fcs)
print('Clip finish!')
But I got the "out of memory" error.
If anyone knows how to solve this problem?
Thank you so much!!!
... but if you want to Dice a polyline featureclass with a basic license, this script may be helpful:
#------------------------------------------------------------------------------- # Name: Dice.py # # Author: xbakker # # Created: 07/01/2015 #------------------------------------------------------------------------------- import arcpy def main(): import sys import traceback import os arcpy.env.overwriteOutput = True try: fc_in = arcpy.GetParameterAsText(0) fc_out = arcpy.GetParameterAsText(1) max_pnts = arcpy.GetParameter(2) sr = arcpy.Describe(fc_in).spatialReference fld_shpin = arcpy.Describe(fc_in).shapeFieldName # create output featureclass out_ws, out_name = os.path.split(fc_out) arcpy.AddMessage("Crear output featureclass '{0}'".format(out_name)) arcpy.CreateFeatureclass_management(out_ws, out_name, "POLYLINE", fc_in, "DISABLED", "DISABLED", sr) # make fields list flds_use = correctFieldList(arcpy.ListFields(fc_in)) # create output cursor cnt_out = 0 with arcpy.da.InsertCursor(fc_out, flds_use) as curs_out: # loop through input features cnt_in = 0 with arcpy.da.SearchCursor(fc_in, flds_use) as curs_in: for row_in in curs_in: cnt_in += 1 if cnt_in % 50 == 0: arcpy.AddMessage("Input Feature: {0}, feature de salida: {1}".format(cnt_in, cnt_out)) polyline_in = row_in[0] pnt_cnt = polyline_in.pointCount if pnt_cnt > max_pnts: for part in polyline_in: if len(part) > max_pnts: lst_part = list(part) lst_chunks = chunks(lst_part, max_pnts) for p in lst_chunks: arr_part = arcpy.Array(p) polyline_out = arcpy.Polyline(arr_part) if polyline_out.length != 0: cnt_out += 1 row_out = buildRow(row_in, flds_use, polyline_out) curs_out.insertRow(row_out) else: # write part arr_part = arcpy.Array(part) polyline_out = arcpy.Polyline(arr_part) cnt_out += 1 row_out = buildRow(row_in, flds_use, polyline_out) curs_out.insertRow(row_out) else: # polyline is OK, write polyline cnt_out += 1 row_out = buildRow(row_in, flds_use, polyline_in) curs_out.insertRow(row_out) except: tb = sys.exc_info()[2] tbinfo = traceback.format_tb(tb)[0] pymsg = "Errores de Python:\nTraceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1]) msgs = "Errores de ArcPy:\n" + arcpy.GetMessages(2) + "\n" arcpy.AddError(pymsg) arcpy.AddError(msgs) def correctFieldList(flds): flds_use = ['Shape@'] fldtypes_not = ['Geometry', 'Guid', 'OID'] for fld in flds: if not fld.type in fldtypes_not: flds_use.append(fld.name) return flds_use def chunks(l, n): """ Yield successive n-sized chunks from l.""" for i in xrange(0, len(l), n): yield l def buildRow(row_in, flds_use, polyline_out): try: lst_in = list(row_in) lst_in[0] = polyline_out return tuple(lst_in) except Exception, e: arcpy.AddWarning("buildRow exception: {0}".format(e)) return None finally: pass if __name__ == '__main__': main()
Thank you for help! Do I need to add this code before my code directly? I am a beginner, so it looks so complex for me, but I will try this! Thanks!
Hi Hua Shang , I think that my code is not the first option you should consider. I would first remove the multi processing and the in_memory workspace. The Dice tool is used to subdivide features with a lot of vertices, which may produce problems when you clip the features.
The code I attached to this thread has been used for a toolbox and reads the input featureclass, name and workspace for the output featureclass and the maximum number of points a feature may have (sorry for the Spanish interface):
It will divide polylines in parts (chunks) if a feature has more the maximum given number of vertices.
Problem resolved? or still ongoing?
Thanks for help. But still got the problem. I'm wondering if it is not the multiprocess problem. I described my question more detail here,Out of memory error I'm really appreciate if I could get your help.