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

You may also like...

退出移动版