近期做arcpy的制图图例,从新建图例属性中建立图例项,并通过arcpy在制图脚本中引用,途中出现一些问题,希望与大家一起探讨:
在码时发现arcpy里有些函数无法使用路径的ur:(pycharm中运行)
# -*- coding:utf-8 -*-
import arcpy
import os
mxd = arcpy.mapping.MapDocument(ur"C:\ArcGIS\T初始.mxd")
df = arcpy.mapping.ListDataFrames(mxd)[0]
lyrFile = arcpy.mapping.Layer(ur"C:\ArcGIS\新建图层组.lyr")
arcpy.mapping.AddLayer(df, lyrFile, "TOP")
styleItem = arcpy.mapping.ListStyleItems("USER_STYLE", "Legend Items", u"图例项宋体25")[0] # "Legend Items"注意这里用英文,而不是样式管理器中显示的中文
lyr = arcpy.mapping.ListLayers(mxd, u'KZST汇总_Merge')[0]
legend = arcpy.mapping.ListLayoutElements(mxd, "LEGEND_ELEMENT")[0]
legend.updateItem(lyr, styleItem)
mxd.save()
del mxd
运行错误:
File "C:/ArcGIS/pythonProject/test.py", line 4
mxd = arcpy.mapping.MapDocument(ur"C:\ArcGIS\T初始.mxd")
SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 2-3: truncated \uXXXX
仅保留r:
mxd = arcpy.mapping.MapDocument(r"C:\ArcGIS\T初始.mxd")
出现另一个问题:
Traceback (most recent call last):
File "C:/ArcGIS/pythonProject/test.py", line 4, in <module>
mxd = arcpy.mapping.MapDocument(r"C:\ArcGIS\T初始.mxd")
File "C:\ArcGIS\Desktop10.8\ArcPy\arcpy\arcobjects\mixins.py", line 651, in __init__
assert (os.path.isfile(mxd) or (mxd.lower() == "current")), gp.getIDMessage(89004, "Invalid MXD filename")
AssertionError: <exception str() failed>
多次修改尝试后,盲猜arcpy.mapping.MapDocument无法在这种状态识别路径的中文:
修改后:
mxd = arcpy.mapping.MapDocument(r"C:\ArcGIS\T1.mxd")
另一行出现问题:
File "C:/ArcGIS/pythonProject/test.py", line 6
lyrFile = arcpy.mapping.Layer(ur"C:\ArcGIS\新建图层组.lyr")
SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 2-3: truncated \uXXXX
最终修改后:
# -*- coding:utf-8 -*-
import arcpy
import os
mxd = arcpy.mapping.MapDocument(r"C:\ArcGIS\T1.mxd")
df = arcpy.mapping.ListDataFrames(mxd)[0]
lyrFile = arcpy.mapping.Layer(r"C:\ArcGIS\新建图层组.lyr")
arcpy.mapping.AddLayer(df, lyrFile, "TOP")
styleItem = arcpy.mapping.ListStyleItems("USER_STYLE", "Legend Items", u"图例项宋体25")[0]
lyr = arcpy.mapping.ListLayers(mxd, u'KZST汇总_Merge')[0]
legend = arcpy.mapping.ListLayoutElements(mxd, "LEGEND_ELEMENT")[0]
legend.updateItem(lyr, styleItem)
mxd.save()
del mxd
才能成功!
总结,arcpy.mapping.MapDocument路径不要出现中文,路径前缀不要同时使用ur:
mxd = arcpy.mapping.MapDocument(u"C:/ArcGIS/副本.mxd")
将反斜杠改为斜杠可以不用写r,也是可以的,即u和r只能保留一个
最后再来一个对比:(也是可以运行的)
mxd = arcpy.mapping.MapDocument(u"C:/ArcGIS/副本.mxd")
df = arcpy.mapping.ListDataFrames(mxd)[0]
lyrFile = arcpy.mapping.Layer("C:/ArcGIS/新建图层组.lyr")
同时注意
styleItem = arcpy.mapping.ListStyleItems("USER_STYLE", "Legend Items", u"图例项宋体25")[0] # "Legend Items"注意这里用英文,而不是样式管理器中显示的中文