使用arcpy.IDW_ga进行插值,第一次请求正确返回,第二次请求为什么报UnexpectedError??

我使用的网络服务器是nginx,当我第一次请求arcpy.IDW_ga处理数据,返回结果ok,当再次请求一遍时,服务器捕捉到错误,
<class 'arcgisscripting.ExecuteError'> : ERROR 999998: Unexpected Error.
Failed to execute (IDW)。
 
哪位知道原因的大神帮忙看看,这个问题已经困扰了我很久
已邀请:

慕晓燕 - 长期ArcGIS爱好者

赞同来自:

这个错误提供的信息量比较少,建议最好是上传脚本和测试数据,来诊断下吧,不然大家可能都无从下手啦。

tigererli

赞同来自:

那我写详细一点:
  
那我写详细一点:

后台python:
1、从数据库中通过给定的接口取出站点的经度、纬度和积温值三个要素,以参数的方式传给绘图函数(gisView.py里面的queryGisData)
2、根据经度、纬度生成一个点shape文件,每个点再添加上积温值这个要素
3、将生成的点shape文件传给反距离插值的函数(arcpy.IDW_ga),生成一个内存文件的地统计图层(outLayer)
4、将内存文件outLayer通过接口函数转换为等值线shape文件(还有等值面),再通过裁剪函数切割成宁夏形状的样子,生成一个新的shape文件,将该shape文件通过函数转化为JSON文件,再通过文件读取获取该JSON文件的字符串,保存到数据库中
前台JS调用:
1、 通过ajax请求获取后台数据库中的JSON数值,将其转化为图层,添加到地图
2、至于染色、标记等都是通过JS API的接口实现

后台python代码:

def queryGisData(querydata,classcount,contour_values):

指定绘图目录
filepath=r"F:\data\output"
env.overwriteOutput = True
env.workspace = filepath

指定绘图范围
env.extent = arcpy.Extent(104.283035,35.237135,107.660430,39.387672)

变量定义
krig_contour = os.path.join(filepath,"krig_contour.shp")
krig_surface = os.path.join(filepath,"krig_surface.shp")
clip_contour = os.path.join(filepath,"clip_contour.shp")
clip_surface = os.path.join(filepath,"clip_surface.shp")
con_json = os.path.join(filepath,"contour.json")
sur_json = os.path.join(filepath,"surface.json")
area_name=r"F:\area\province\宁夏.shp"
result=[]

每次画之前都把目录清空,防止文件已存在异常
for item in os.listdir(filepath):
itemsrc=os.path.join(filepath,item)
if os.path.isfile(itemsrc):
os.remove(itemsrc)
elif os.path.isdir(itemsrc):
shutil.rmtree(itemsrc)

try:
参数定义 
newfc="newpoint.shp"
has_m = "ENABLED"
has_z = "ENABLED"
sr = arcpy.SpatialReference("WGS 1984")

创建一个点shape文件
arcpy.CreateFeatureclass_management(filepath, newfc, "POINT", "", \
has_m, has_z,sr)

给点shape文件添加Z字段,也就是保存积温值的变量
arcpy.AddField_management(newfc, 'z', 'double', '12', '8')

生成往点shape文件插入数据的游标
cur = arcpy.InsertCursor(newfc)


min_value= 9999999.99 //保存积温值最小值
max_value= -9999999.99 //保存积温值最大值
for item in querydata: //遍历数据库中取出的数据
x = item[0] //x是经度
y = item[1] //y是纬度
z = float(item[2]) //z是积温值
pnt = arcpy.Point(float(x), float(y)) //根据经纬度生成点对象
if min_value>z:
min_value=z //获取积温最小值
if max_value<z:
max_value=z //获取积温最小值

row = cur.newRow() //向点shape文件插入新的一行数据
row.Shape = pnt //将点对象插入
row.z = z //将积温值插入
cur.insertRow(row) //一行数据插入成功
del row //删除游标

这个函数是用来对积温最大值和最小值取整
setvalue=reSetValue(min_value,max_value)

取整后返回的值分别赋予这两个变量
min_value=setvalue[0]
max_value=setvalue[1]


zField = "z" //这个z字段和上面创建点shape文件的z字段必须是对应的

outLayer = "outEBK"
outRaster = ""
cellSize = ""
power=2
# Set variables for search neighborhood
majSemiaxis = 300000
minSemiaxis = 300000
angle = 0
smoothFactor = 0.5
searchNeighbourhood = arcpy.SearchNeighborhoodSmooth(majSemiaxis, minSemiaxis,angle, smoothFactor)

反距离插值算法执行函数
arcpy.IDW_ga(newfc, zField, outLayer, outRaster, cellSize,
power, searchNeighbourhood)

如果前台是根据等值线间距重新绘制,通过这个函数来获取对应的值
if classcount!="":
classbreak=getBreakValue(min_value,max_value,classcount)

如果前台是根据自定义等值线值重新绘制,通过这个函数获取对应的值
else:
classbreak=getCertainValue(min_value,max_value,contour_values)

内存文件地统计图层转化为等值线
arcpy.GALayerToContour_ga(outLayer, "CONTOUR", krig_contour,"DRAFT","MANUAL","",classbreak)
对等值线文件进行裁剪
arcpy.Clip_analysis(krig_contour, area_name, clip_contour)
将裁剪的等值线文件转化为JSON数据 arcpy.FeaturesToJSON_conversion(clip_contour,con_json,"NOT_FORMATTED","Z_VALUES")

内存文件地统计图层转化为等值面 arcpy.GALayerToContour_ga(outLayer,"FILLED_CONTOUR",krig_surface,"DRAFT","MANUAL","",classbreak)
arcpy.Clip_analysis(krig_surface, area_name, clip_surface) arcpy.FeaturesToJSON_conversion(krig_surface,sur_json,"NOT_FORMATTED","Z_VALUES")

读取JSON文件,获取内容
f1 = open(con_json, "r")
contour_json = f1.read()
f2=open(sur_json,"r")
surface_json=f2.read()
f1.close()
f2.close()
result.append(contour_json)
result.append(surface_json)
return result
except:
info=sys.exc_info()
print info[0],":",info[1]
return info[0]
finally:
del cur
gc.collect()

tigererli

赞同来自:

=10.5000pt后台python原理=10.5000pt:=10.5000pt
=10.5000pt1、 =10.5000pt从数据库中通过给定的接口取出=10.5000pt站点=10.5000pt的经度、纬度和积温值三个要素=10.5000pt,=10.5000pt以参数的=10.5000pt方式=10.5000pt传给绘图函数(=10.5000ptgisView.py里面的=10.5000ptqueryGisData)=10.5000pt
=10.5000pt2、 =10.5000pt根据=10.5000pt经度、纬度生成一个点=10.5000ptsh=10.5000ptape=10.5000pt文件,=10.5000pt每个点再添加上积温值这个要素=10.5000pt
=10.5000pt3、 =10.5000pt将=10.5000pt生成的点=10.5000ptshape文件=10.5000pt传给反距离=10.5000pt插=10.5000pt值的函数=10.5000pt(=10.5000ptarcpy.IDW_ga=10.5000pt),生成一个=10.5000pt内存=10.5000pt文件的地=10.5000pt统计=10.5000pt图层=10.5000pt(=10.5000ptoutLayer=10.5000pt)=10.5000pt
=10.5000pt4、 =10.5000pt将=10.5000pt内存=10.5000pt文件=10.5000ptoutLayer=10.5000pt通过=10.5000pt接口函数转换为等值线=10.5000ptshape文件(还=10.5000pt有等值面),=10.5000pt再=10.5000pt通过裁剪函数切割成宁夏=10.5000pt形状=10.5000pt的样子,生成一个=10.5000pt新=10.5000pt的=10.5000ptshape文件,=10.5000pt将该=10.5000ptshape文件=10.5000pt通过函数转化为JSON文件,再通过文件读取=10.5000pt获取=10.5000pt该JSON文件的字符串,保存到数据库中=10.5000pt
=10.5000pt前台JS调用=10.5000pt原理:=10.5000pt
=10.5000pt1、 =10.5000pt =10.5000pt通过ajax请求=10.5000pt获取后台数据库中的JSON数值,将其转化为图层=10.5000pt,=10.5000pt添加=10.5000pt到地图=10.5000pt
=10.5000pt2、 =10.5000pt至于=10.5000pt染色=10.5000pt、标记=10.5000pt等都是通过JS=10.5000pt =10.5000ptAPI的接口实现
def queryGisData(querydata,classcount,contour_values):

指定绘图目录
filepath=r"F:\data\output"
env.overwriteOutput = True
env.workspace = filepath

指定绘图范围
env.extent = arcpy.Extent(104.283035,35.237135,107.660430,39.387672)

变量定义
krig_contour = os.path.join(filepath,"krig_contour.shp")
krig_surface = os.path.join(filepath,"krig_surface.shp")
clip_contour = os.path.join(filepath,"clip_contour.shp")
clip_surface = os.path.join(filepath,"clip_surface.shp")
con_json = os.path.join(filepath,"contour.json")
sur_json = os.path.join(filepath,"surface.json")
area_name=r"F:\area\province\宁夏.shp"
result=[]

每次画之前都把目录清空,防止文件已存在异常
for item in os.listdir(filepath):
itemsrc=os.path.join(filepath,item)
if os.path.isfile(itemsrc):
os.remove(itemsrc)
elif os.path.isdir(itemsrc):
shutil.rmtree(itemsrc)

try:
参数定义 
newfc="newpoint.shp"
has_m = "ENABLED"
has_z = "ENABLED"
sr = arcpy.SpatialReference("WGS 1984")

创建一个点shape文件
arcpy.CreateFeatureclass_management(filepath, newfc, "POINT", "", \
has_m, has_z,sr)

给点shape文件添加Z字段,也就是保存积温值的变量
arcpy.AddField_management(newfc, 'z', 'double', '12', '8')

生成往点shape文件插入数据的游标
cur = arcpy.InsertCursor(newfc)


min_value= 9999999.99 //保存积温值最小值
max_value= -9999999.99 //保存积温值最大值
for item in querydata: //遍历数据库中取出的数据
x = item[0] //x是经度
y = item[1] //y是纬度
z = float(item[2]) //z是积温值
pnt = arcpy.Point(float(x), float(y)) //根据经纬度生成点对象
if min_value>z:
min_value=z //获取积温最小值
if max_value<z:
max_value=z //获取积温最小值

row = cur.newRow() //向点shape文件插入新的一行数据
row.Shape = pnt //将点对象插入
row.z = z //将积温值插入
cur.insertRow(row) //一行数据插入成功
del row //删除游标

这个函数是用来对积温最大值和最小值取整
setvalue=reSetValue(min_value,max_value)

取整后返回的值分别赋予这两个变量
min_value=setvalue[0]
max_value=setvalue[1]


zField = "z" //这个z字段和上面创建点shape文件的z字段必须是对应的

outLayer = "outEBK"
outRaster = ""
cellSize = ""
power=2
# Set variables for search neighborhood
majSemiaxis = 300000
minSemiaxis = 300000
angle = 0
smoothFactor = 0.5
searchNeighbourhood = arcpy.SearchNeighborhoodSmooth(majSemiaxis, minSemiaxis,angle, smoothFactor)

反距离插值算法执行函数
arcpy.IDW_ga(newfc, zField, outLayer, outRaster, cellSize,
power, searchNeighbourhood)

如果前台是根据等值线间距重新绘制,通过这个函数来获取对应的值
if classcount!="":
classbreak=getBreakValue(min_value,max_value,classcount)

如果前台是根据自定义等值线值重新绘制,通过这个函数获取对应的值
else:
classbreak=getCertainValue(min_value,max_value,contour_values)

内存文件地统计图层转化为等值线
arcpy.GALayerToContour_ga(outLayer, "CONTOUR", krig_contour,"DRAFT","MANUAL","",classbreak)
对等值线文件进行裁剪
arcpy.Clip_analysis(krig_contour, area_name, clip_contour)
将裁剪的等值线文件转化为JSON数据 arcpy.FeaturesToJSON_conversion(clip_contour,con_json,"NOT_FORMATTED","Z_VALUES")

内存文件地统计图层转化为等值面 arcpy.GALayerToContour_ga(outLayer,"FILLED_CONTOUR",krig_surface,"DRAFT","MANUAL","",classbreak)
arcpy.Clip_analysis(krig_surface, area_name, clip_surface) arcpy.FeaturesToJSON_conversion(krig_surface,sur_json,"NOT_FORMATTED","Z_VALUES")

读取JSON文件,获取内容
f1 = open(con_json, "r")
contour_json = f1.read()
f2=open(sur_json,"r")
surface_json=f2.read()
f1.close()
f2.close()
result.append(contour_json)
result.append(surface_json)
return result
except:
info=sys.exc_info()
print info[0],":",info[1]
return info[0]
finally:
del cur
gc.collect()

=10.5000pt

麻哒!!!

赞同来自:

请问怎样在add-in中动态获取当前图层(python下)

要回复问题请先登录注册