Python之Arcpy按位置选择批处理(SelectLayerByLocation)
工作中,往常使用FME批量压盖选取不同城市的Link、Node数据(存储于GDB地理数据库),能否通过Python引用Arcpy顺利实现上述功能?
已知Arcgis中的手动操作步骤:
1、使用城市范围tile.shp按位置选择Link.shp,导出城市范围选择出的Link.shp
2、使用城市范围选择出的Link.shp,按位置选择导出本城市的Node.shp
记录下尝试过程及思考:
1、 预处理——GDB地理数据库导出Shapefile
Feature Class To Shapefile (multiple),得到包含不同城市数据的Link.shp和Node.shp
2、 按位置选择——SelectLayerByLocation ()函数
使用说明书:Arcigis帮助,搜索想要使用的工具,函数的参数及用法示例很详细。
注意:SelectLayerByLocation ()函数的输入参数需要lyr文件,而不能使用现有的shp文件。所以必须先做一步转换——利用MakeFeatureLayer_management ()函数,使*.shp生成对应的*.lyr文件。
思考:查找资料首选正规详尽的官方资料,养成这种习惯,省时省力。
3、 创建要素图层——MakeFeatureLayer_management ()函数
继续使用说明书,ARCGIS官网十分好用,搜索工具,这里介绍详尽。此函数根据输入要素类或图层文件创建要素图层:
MakeFeatureLayer_management (in_features, out_layer, {where_clause}, {workspace}, {field_info})
注意:该工具创建的图层是临时图层(过程文件,类似于函数的局部变量),如果不将此图层主动保存,该图层在会话结束后将不会继续存在。
4、复制要素——CopyFeatures_management()
将处于选中状态的Link\Node数据图层复制为新要素类,即提取出了某城市的Link.shp和Node.shp数据。
注意:批量选择出的城市Link\Node的Shapefile数据,*.dbf数据大小过大。在Arcgis中打开可以发现,属性表中有大量冗余字段值。相比FME的提取效果,还需进一步分析改进。
以2城市批处理为例,实现代码如下:
#coding='UTF-8'
#SelectLayerByLocation
import arcpy
arcpy.env.workspace = 'D:/PythonCode_inWork/07SelectLayerByLocation/01_LinkNode'
#以2城市测试
city_names={#配合arcpy包使用python2.7,注意语法
u'三亚':'SANYA',
u'东莞':'DONGGUAN'}#,
##u'中山':'ZHONGSHAN',
##u'乌鲁木齐':'WULUMUQI',
##u'佛山':'FOSHAN',
##u'保定':'BAODING',
##u'兰州':'LANZHOU',
##u'南京':'NANJING',
##u'南宁':'NANNING',
##u'南昌':'NANCHANG'
##u'南通':'NANTONG',
##u'厦门':'XIAMEN',
##u'台州':'TAIZHOU',
##u'合肥':'HEFEI',
##u'呼和浩特':'HUHEHAOTE',
##u'哈尔滨':'HAERBIN',
##u'唐山':'TANGSHAN',
##u'大连':'DALIAN',
##u'天津':'TIANJIN',
##u'太原':'TAIYUAN',
##u'宁波':'NINGBO',
##u'常州':'CHANGZHOU',
##u'徐州':'XUZHOU',
##u'惠州':'HUIZHOU',
##u'成都':'CHENGDU',
##u'扬州':'YANGZHOU',
##u'无锡':'WUXI',
##u'昆明':'KUNMING',
##u'杭州':'HANGZHOU',
##u'柳州':'LIUZHOU',
##u'武汉':'WUHAN',
##u'泉州':'QUANZHOU',
##u'济南':'JINAN',
##u'海口':'HAIKOU',
##u'温州':'WENZHOU',
##u'潍坊':'WEIFANG',
##u'烟台':'YANTAI',
##u'珠海':'ZHUHAI',
##u'盐城':'YANCHENG',
##u'石家庄':'SHIJIAZHUANG',
##u'福州':'FUZHOU',
##u'秦皇岛':'QINHUANGDAO',
##u'绍兴':'SHAOXING',
##u'芜湖':'WUHU',
##u'苏州':'SUZHOU',
##u'西宁':'XINING',
##u'西安':'XIAN',
##u'贵阳':'GUIYANG',
##u'郑州':'ZHENGZHOU',
##u'重庆':'CHONGQING',
##u'金华':'JINHUA',
##u'银川':'YINCHUAN',
##u'长春':'CHANGCHUN',
##u'长沙':'CHANGSHA',
##u'青岛':'QINGDAO',
##u'沈阳':'SHENYANG',
##u'广州':'GUANGZHOU',
##u'上海':'SHANGHAI',
##u'深圳':'SHENZHEN',
##u'北京':'BEIJING'
##}
###GDB转为shp批量——要素类转 Shapefile (转换)
##arcpy.FeatureClassToShapefile_conversion (GDBspace, GDB_to_SHP)
#select overlap——按位置选择
num = 0
GDBtoLinkNode = 'D:/PythonCode_inWork/07SelectLayerByLocation/01_LinkNode/GDBtoLinkNode/'
LINK = GDBtoLinkNode + 'RD_LINK.shp'
NODE = GDBtoLinkNode + 'RD_NODE.shp'
for city_k,city_v in city_names.items():
# Local variables:
RD_LINK = 'RD_LINK.shp'
RD_NODE = 'RD_NODE.shp'
CUT_CITY = city_v+'.shp'
LINK = arcpy.env.workspace + '/GDBtoLinkNode/' + RD_LINK
NODE = arcpy.env.workspace + '/GDBtoLinkNode/' + RD_NODE
CUT = arcpy.env.workspace + '/CUT/' + CUT_CITY
#清除已有'LINK_lyr'和'NODE_lyr'
#或每个城市'LINK_lyr'和'NODE_lyr'区分命名
LINK_lyr = city_v+'LINK_lyr'
NODE_lyr = city_v+'NODE_lyr'
CUT_lyr = city_v+'CUT_lyr'
# Process: SelectLayerByLocation_management
arcpy.MakeFeatureLayer_management(LINK, LINK_lyr)#参数必须为内存图层,不能用硬盘上的shp,否则会报错
arcpy.MakeFeatureLayer_management(NODE, NODE_lyr)
arcpy.MakeFeatureLayer_management(CUT, CUT_lyr)
arcpy.SelectLayerByLocation_management(LINK_lyr, "INTERSECT", CUT_lyr, "", 'NEW_SELECTION')
arcpy.SelectLayerByLocation_management(NODE_lyr, "INTERSECT", LINK_lyr, "", 'NEW_SELECTION')
CUT_Link = arcpy.env.workspace + '/CUT_LinkNode/' + city_v+ '/'+RD_LINK
CUT_Node = arcpy.env.workspace + '/CUT_LinkNode/' + city_v+ '/'+RD_NODE
arcpy.CopyFeatures_management(LINK_lyr, CUT_Link)#复制要素:如果输入是具有选定内容的图层,则仅复制所选要素
arcpy.CopyFeatures_management(NODE_lyr, CUT_Node)
print city_v+' RD_LINK&NODE is OK!'
num += 1
print str(num)+'cities are OK!'
转载自:https://blog.csdn.net/lzqg1990/article/details/88847252