一个关于Toolbox运行自定义Python脚本运行问题
我最近两天在家写了两个Python文件,并在Toolbox中新建了一个工具箱,配置了Python脚本和输入输出参数,有一个昨天上午还运行正常,另外一个下午写的还没调试,但是昨天傍晚开始两个文件运行失败,就连之前运行正常的也不行了,之前运行正常的,运行到pCursor = arcpy.da.InsertCursor(strFeatureClass,["shape@"])就出错,提示对应shape文件打不开,另外一个文件,运行到with arcpy.da.SearchCursor(strFeatureClass,['SHAPE@']) as pCursor:就出错。有哪位高手知道这是啥问题吗?如果有必要的话,我可以把完整的代码贴出来。
1 个回复
tranlynn_lau
赞同来自:
import arcpy
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
pCursor = None
try:
#打开界址点坐标文件(需要注意中文路径转换)
txtCoorFile = arcpy.GetParameterAsText(0)
pCoorFile = open(txtCoorFile,'r')
#读取所有界址点坐标串
pCoorLines = pCoorFile.readlines()
pCoorFile.close()
#定义多边形数组
pArrayPolygons=arcpy.Array()
#初始化圈号
QuanHao = '0'
pArrayPolygon = None
for pCoorLine in pCoorLines:
#剔除换行回车符
pCoorLine = pCoorLine.strip()
pCoors = str(pCoorLine).split(',')
#判断是否是”界址点号,圈号,X坐标,Y坐标” 格式
if len(pCoors) == 4:
#判断上一行与当前行的圈号是否相等,如果不相等,则要判断是第一行还是新增一个地块
if QuanHao != pCoors[1]:
#如果当前地块不为空,则将该地块添加到多边形中
if pArrayPolygon != None:
pArrayPolygons.add(pArrayPolygon)
#重置当前地块 并将当前坐标点添加到当前地块中
pArrayPolygon=arcpy.Array()
pArrayPolygon.add(arcpy.Point(float(pCoors[3]),float(pCoors[2])))
#赋值当前地块圈号
QuanHao = pCoors[1]
else:
#将当前坐标点添加到当前地块中
pArrayPolygon.add(arcpy.Point(pCoors[3],pCoors[2]))
else:
continue;
#如果多边形不为空,则将该地块添加到多边形中
if pArrayPolygon != None:
pArrayPolygons.add(pArrayPolygon)
#赋值新建SHAPE地址
strFeatureClass = arcpy.GetParameterAsText(1)
#创建SHAPE文件
arcpy.CreateFeatureclass_management(os.path.dirname(strFeatureClass),os.path.basename(strFeatureClass),"POLYGON")
#新增一个要素记录
pCursor = arcpy.da.InsertCursor(strFeatureClass,["shape@"])
#将当前多边形保存到要素记录中
pCursor.insertRow([arcpy.Polygon(pArrayPolygons)])
print("入库完成!")
except arcpy.ExecuteError:
arcpy.AddError(arcpy.GetMessages(2))
except Exception as e:
arcpy.AddError(e)
print("发生错误,错误信息如下:->\r\n" + str(e))
finally:
if pCursor:
del pCursor
#============以下是第二个文件代码===============
import arcpy
import os
import sys
#要素游标和多边形变量初始化
pCursor = None
pArrayPoints=None
try:
#获取Shape文件路径和界址点坐标文件路径
strFeatureClass = arcpy.GetParameterAsText(0)
txtCoorFile = arcpy.GetParameterAsText(0)
strFeatureClass = strFeatureClass.decode('utf-8')
txtCoorFile = txtCoorFile.decode('utf-8')
#设置Shape文件工作空间
arcpy.env.workspace = os.path.dirname(strFeatureClass)
#打开待写入的界址点坐标文件
pCoorFile = open(txtCoorFile,'w')
#初始化圈号和界址点点号变量
intQuanHao_Wai = 0
intDianNo_All = 0
#搜索Shape文件各要素
with arcpy.da.SearchCursor(strFeatureClass,['SHAPE@']) as pCursor:
for pFeatureRow in pCursor:
for pPartPoints in pFeatureRow[0]:
#外圈号累加1
intQuanHao_Wai+=1
#以下代码是为获取当前圈号多边形对应的面积和界址点数量
#当前圈号对应界址点数变量初始化
intDianNums = 0
pArrayPoints=arcpy.Array()
for pPoint in pPartPoints:
if pPoint:
intDianNums+=1
pArrayPoints.add(arcpy.Point(pPoint.Y,pPoint.X))
#由Array点组创建生成当前圈号多边形面
pPolygon = arcpy.Polygon(pArrayPoints)
#写入当前圈号地块头信息,格式如下:
#界址点数, 地块面积, 地块编号, 地块名称, 记录图形属性(点、线、面), 图幅号, 地块用途, 地类编码,@
pCoorFile.write(str(intDianNums) + ',' + "{:.4f}".format(pPolygon.area) + str(intQuanHao_Wai) + ',地块' + str(intQuanHao_Wai) + ',面,,,@\n')
#初始化内圈号及其对应的起始点号、累计点号和起始点对象
intQuanHao_Nei = 1
intDianNo_QiShi = 0
intDianNo_LeiJi = 0
pPoint_QiShi = None
for pPoint in pPartPoints:
if pPoint:
#内圈号和界址点点号累加1
intDianNo_LeiJi+=1
intDianNo_All+=1
#如果是第一个点,则将第一个点序号和点对象记录下来,并往文件中写入坐标串信息;
#如果不是第一个点,则直接写入坐标串信息(最后一个点需要与第一点判断)
if intDianNo_LeiJi==1:
pPoint_QiShi = pPoint
intDianNo_QiShi = intDianNo_All
pCoorFile.write('J' + str(intDianNo_All) + ',' + str(intQuanHao_Nei) + ',' + "{:.4f},{:.4f}".format(pPoint.Y, pPoint.X)+ '\n')
else:
if "{:.4f},{:.4f}".format(pPoint.Y, pPoint.X) == "{:.4f},{:.4f}".format(pPoint_QiShi.Y, pPoint_QiShi.X):
pCoorFile.write('J' + str(intDianNo_QiShi) + ',' + str(intQuanHao_Nei) + ',' + "{:.4f},{:.4f}".format(pPoint.Y, pPoint.X)+ '\n')
intDianNo_All-=1
else:
pCoorFile.write('J' + str(intDianNo_All) + ',' + str(intQuanHao_Nei) + ',' + "{:.4f},{:.4f}".format(pPoint.Y, pPoint.X)+ '\n')
else:
#如果为空,代表又重新出现下一个内圈(即洞),则累计点号与起始点号重置0,内部圈号累加1
intDianNo_LeiJi = 0
intDianNo_QiShi = 0
intQuanHao_Nei+=1
#关闭文件
pCoorFile.close()
print("写入完成!")
except arcpy.ExecuteError:
arcpy.AddError(arcpy.GetMessages(2))
except Exception as e:
arcpy.AddError(e)
print("发生错误,错误信息如下:->\r\n" + str(e))
finally:
if pArrayPoints:
del pArrayPoints
if pCursor:
del pCursor
要回复问题请先登录或注册