在ArcMap中可以制作Python加载项来添加一些功能实用的小工具。
学习Python加载项可以参考:
使用python制作ArcGIS插件(1)工具介绍使用python制作ArcGIS插件(2)代码编写使用python制作ArcGIS插件(3)ArcPy的使用说明使用python制作ArcGIS插件(4)界面交互使用python制作ArcGIS插件(5)其他技巧使用python制作ArcGIS插件(6)案例分析
下图的小班编号工具就是Python加载项
点击启用工具,在下拉列表中选好要编号的图层和字段,输入起始编号后回车就可以点击编号工具开始编号了
起始编号值默认为1,每点击一个小班会把编号值计算到选好的字段中,然后编号值会加1
下面是小班编号工具Python加载项中config.xml的代码:
<ESRI.Configuration xmlns="http://schemas.esri.com/Desktop/AddIns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Name>xiaobanbianhao</Name><AddInID>{5eb1c9bf-e5bb-4c0e-98ff-4e6abcb61f42}</AddInID><Description>xiaobanbianhaogongjv</Description><Version>0.1</Version><Image>Images\58e54c7f1eb7c7f6.png</Image><Author>ZX</Author><Company>GIS</Company><Date>12/13/2021</Date><Targets><Target name="Desktop" version="10.1" /></Targets><AddIn language="PYTHON" library="xiaobanbianhao_addin.py" namespace="xiaobanbianhao_addin"><ArcMap>
<Commands>
<Button caption="启用" category="xiaobanbianhao" class="ButtonClass1" id="xiaobanbianhao_addin.button1" image="Images\2021-12-15_102733.png" message="启用小班编号工具" tip="启用工具"><Help heading="启用工具">启用小班编号工具</Help></Button>
<ComboBox caption="图层" category="xiaobanbianhao" class="ComboBoxClass1" id="xiaobanbianhao_addin.combobox1" itemSizeString="WWWWWW" message="选择要编号的图层" rows="4" sizeString="WWWWWW" tip="选择图层"><Help heading="选择图层">选择要编号的图层</Help></ComboBox>
<ComboBox caption="字段" category="xiaobanbianhao" class="ComboBoxClass2" id="xiaobanbianhao_addin.combobox2" itemSizeString="WWWWWW" message="选择要编号的字段" rows="4" sizeString="WWWWWW" tip="选择字段"><Help heading="选择字段">选择要编号的字段</Help></ComboBox>
<ComboBox caption="起始编号" category="xiaobanbianhao" class="ComboBoxClass3" id="xiaobanbianhao_addin.combobox3" itemSizeString="WWWWWW" message="在框中输入编号起始值,默认值为1" rows="4" sizeString="WWWWWW" tip="输入起始编号"><Help heading="输入起始编号">在框中输入编号起始值,默认值为1</Help></ComboBox>
<Tool caption="编号工具" category="xiaobanbianhao" class="ToolClass5" id="xiaobanbianhao_addin.tool1" image="Images\2021-12-13_153614_16.png" message="从起始编号开始,点击小班依次编号" tip="点击小班编号"><Help heading="点击小班编号">从起始编号开始,点击小班依次编号</Help></Tool>
</Commands>
<Extensions>
</Extensions>
<Toolbars>
<Toolbar caption="小班编号" category="xiaobanbianhao" id="xiaobanbianhao_addin.toolbar" showInitially="true"><Items><Button refID="xiaobanbianhao_addin.button1" /><ComboBox refID="xiaobanbianhao_addin.combobox1" /><ComboBox refID="xiaobanbianhao_addin.combobox2" /><ComboBox refID="xiaobanbianhao_addin.combobox3" /><Tool refID="xiaobanbianhao_addin.tool1" /></Items></Toolbar>
</Toolbars>
<Menus>
</Menus>
</ArcMap></AddIn></ESRI.Configuration>
下面是小班编号工具Python加载项中『Install』文件夹下xiaobanbianhao_addin.py的代码:
import arcpy
import pythonaddins
class ZX:
tucengming="" #图层名
ziduanming="" #字段名
class ButtonClass1(object): #启用工具按钮
def __init__(self):
self.enabled = True
self.checked = False #按钮初始状态没有被选中
def onClick(self): #点击按钮启用图层组合框并为图层组合框下拉列表赋值
list1=[]
mxd = arcpy.mapping.MapDocument("CURRENT") #获取当前工程
for lyr in arcpy.mapping.ListLayers(mxd): #获取当前工程所有图层
list1.append(lyr.name) #把图层名(图层对象lyr的name属性)追加到列表list1
combobox1.enabled = True #启用图层组合框(图层组合框的变量名为combobox1,与config.xml中id="xiaobanbianhao_addin.combobox1"中的combobox1相同)
combobox1.items = list1 #为图层组合框下拉列表赋值
combobox1.refresh() #刷新图层组合框
arcpy.RefreshActiveView()
class ComboBoxClass1(object): #图层组合框
def __init__(self):
self.items = [] #初始状态时组合框下拉列表
self.editable = True
self.enabled = False #图层组合框初始状态没有启用
self.dropdownWidth = 'ZZZZZ' #几个相同的字符表示组合框下拉列表的长度为几
self.width = 'XXXXXXXXX' #几个相同的字符表示组合框的宽度为几
self.value="ZX" #初始状态时组合框内显示的字符
def onSelChange(self, selection): #点击组合框下拉列表选项时触发
self.value=selection #组合框内显示的内容赋值为下拉列表选中内容
self.refresh() #刷新
list2=[]
ZX.tucengming = selection #ZX类tucengming属性赋值为下拉列表选中内容
mxd = arcpy.mapping.MapDocument("CURRENT") #获取当前工程
lyr=arcpy.mapping.ListLayers(mxd,ZX.tucengming)[0] #获取当前工程图层名为ZX.tucengming属性值的图层
if lyr.supports("DATASOURCE") and lyr.supports("DESCRIPTION"): #测试lyr图层是否支持图层的完整路径和描述两种属性
lyr_dataSource=lyr.dataSource #获取图层的完整路径
lyr.description="1" #图层的描述属性赋值为1,这个属性是可读写属性,相当于全局变量,用来记录小班号
fields = arcpy.ListFields(lyr_dataSource) #获取lyr图层要素的所有字段
for field in fields: #遍历lyr图层要素的每一个字段
list2.append(field.name) #将字段名追加到列表list2
combobox2.enabled = True #启用字段组合框(字段组合框的变量名为combobox2,与config.xml中id="xiaobanbianhao_addin.combobox2"中的combobox2相同)
combobox2.items = list2 #为字段组合框下拉列表赋值
combobox2.refresh() #刷新字段组合框
tool1.enabled = False #禁用编号工具(限制必须选好图层选好字段才开始编号)
combobox3.enabled = False #禁用起始编号组合框
def onEditChange(self, text):
pass
def onFocus(self, focused):
pass
def onEnter(self):
pass
def refresh(self):
pass
class ComboBoxClass2(object): #字段组合框
def __init__(self):
self.items = [] #初始状态时组合框下拉列表
self.editable = True
self.enabled = False #字段组合框初始状态没有启用
self.dropdownWidth = 'ZZZZZ' #几个相同的字符表示组合框下拉列表的长度为几
self.width = 'XXXXXXX' #几个相同的字符表示组合框的宽度为几
self.value="ZX" #初始状态时组合框内显示的字符
def onSelChange(self, selection): #点击组合框下拉列表选项时触发
self.value=selection #组合框内显示的内容赋值为下拉列表选中内容
self.refresh() #刷新
ZX.ziduanming = selection #ZX类ziduanming属性赋值为下拉列表选中内容
tool1.enabled = True #启用编号工具(编号工具的变量名为tool1,与config.xml中id="xiaobanbianhao_addin.tool1"中的tool1相同)
combobox3.enabled = True #启用起始编号组合框(起始编号组合框的变量名为combobox3,与config.xml中id="xiaobanbianhao_addin.combobox3"中的combobox3相同)
combobox3.refresh() #刷新起始编号组合框
def onEditChange(self, text):
pass
def onFocus(self, focused):
pass
def onEnter(self):
pass
def refresh(self):
pass
class ComboBoxClass3(object): #起始编号组合框
def __init__(self):
self.items = [] #初始状态时组合框下拉列表,这个组合框采用输入起始编号后回车触发,下拉列表会一直为空
self.editable = True
self.enabled = False #起始编号组合框初始状态没有启用
self.dropdownWidth = 'ZZZZZ' #几个相同的字符表示组合框下拉列表的长度为几
self.width = 'XXXXX' #几个相同的字符表示组合框的宽度为几
self.value = "1" #初始状态时组合框内显示的字符
def onSelChange(self, selection):
pass
def onEditChange(self, text):
pass
def onFocus(self, focused):
pass
def onEnter(self): #在组合框中输入起始编号后回车触发
self.refresh() #刷新
mxd = arcpy.mapping.MapDocument("CURRENT") #获取当前工程
lyr=arcpy.mapping.ListLayers(mxd,ZX.tucengming)[0] #获取当前工程图层名为ZX.tucengming属性值的图层
lyr.description=self.value #图层的描述属性赋值为输入的起始编号
arcpy.RefreshActiveView() #刷新当前工程
def refresh(self):
pass
class ToolClass5(object): #编号工具
def __init__(self):
self.enabled = False #编号工具初始状态没有启用
self.shape = "NONE" #编号工具通过点击获取地图x,y坐标与小班交互,不需要画出形状
def onMouseDown(self, x, y, button, shift):
pass
def onMouseDownMap(self, x, y, button, shift): #捕捉并返回鼠标按下时所在的地图x,y坐标
mxd = arcpy.mapping.MapDocument("CURRENT") #获取当前工程
lyr=arcpy.mapping.ListLayers(mxd,ZX.tucengming)[0] #获取当前工程图层名为ZX.tucengming属性值的图层
bianhao=lyr.description #变量bianhao赋值为lyr图层的描述属性值
pointGeom = arcpy.PointGeometry(arcpy.Point(x, y), mxd.activeDataFrame.spatialReference) #根据返回的x,y坐标新建点几何对象
arcpy.SelectLayerByLocation_management(lyr, "INTERSECT", pointGeom) #按位置选择图层,选出与新建点几何对象相交的lyr图层小班
arcpy.CalculateField_management(lyr, ZX.ziduanming,bianhao, "VB") #对lyr图层计算字段,为选出的字段赋值小班编号
bianhao_shuzi=int(bianhao) #把小班编号字符转数字
bianhao_shuzi+=1 #小班编号加1
xinbianhao=str(bianhao_shuzi) #把小班编号数字转字符
lyr.description=xinbianhao #将lyr图层的描述属性值赋值为加1后小班编号
arcpy.SelectLayerByAttribute_management(lyr, "CLEAR_SELECTION") #清除lyr图层选择
arcpy.RefreshActiveView() #刷新当前工程
def onMouseUp(self, x, y, button, shift):
pass
def onMouseUpMap(self, x, y, button, shift):
pass
def onMouseMove(self, x, y, button, shift):
pass
def onMouseMoveMap(self, x, y, button, shift):
pass
def onDblClick(self):
pass
def onKeyDown(self, keycode, shift):
pass
def onKeyUp(self, keycode, shift):
pass
def deactivate(self):
pass
def onCircle(self, circle_geometry):
pass
def onLine(self, line_geometry):
pass
def onRectangle(self, rectangle_geometry):
pass
代码中使用图层可读写的description(描述)属性保存小班编号,这个属性的作用相当于全局变量
图层可读写属性包括:
brightness——亮度——整型
contrast——对比度——整型
credits——版权信息——字符型
definitionQuery——定义查询——字符型
description——描述——字符型
labelClasses——标注类——标注类型
maxScale——最大(显示)比例——双精度型
minScale——最小(显示)比例——双精度型
name——图层名——字符型
showLabels——显示标注——布尔型
transparency——透明度——整型
visible——图层可见——布尔型
具体可以参考帮助文档
不是所有的图层都支持这些属性,可以使用supports方法预先进行测试
小班编号工具在ArcMap10.8中可以运行,其他版本没有测试
下载地址如下:
小班编号工具