【利用Arcpy快速检索矢量文件和栅格文件并进行统计和删除工作】

这里写目录标题

  • 场景分析
  • 解决思路和方法
    • 解决思路
    • 代码
  • 拓展的知识及应用分析
    • 快速获取文件夹中的所有矢量文件和栅格文件名称
      • 矢量文件
      • 栅格文件
    • 快速数据库中的矢量文件和栅格文件名称
    • 快速读取每个矢量文件中都包含多少个对象
  • 补充—检索文件中以“ ”开头,以“ ”结尾的文件名
  • 结语

场景分析

基于水系名称,从多对象矢量图层种筛选的对象时候,有一些水系名称并未在多对象矢量图层中,但会建立空的shp矢量文件,主要想解决的问题是把空的矢量shp文件删除掉,空矢量文件的属性表如下图。
【利用Arcpy快速检索矢量文件和栅格文件并进行统计和删除工作】_第1张图片

解决思路和方法

解决思路

思路比较简单,首先找出空的shp文件,然后删除即可。

代码

本代码依托于Arcmap工具中,从Arcmap中打开python窗口(Arcmap中自带了python2.7工具)

//导入包
# -*- coding: UTF-8 -*-
import os
import arcpy
//检索出空缺的矢量图层
arcpy.env.workspace=r"输出要检查的矢量数据所在的文件夹"  #设置当前的文件夹为默认路径
List=arcpy.ListFeatureClasses()  #读取当前默认文件夹下的所有要素类(shp文件)名称,并保存为一个列表传给参数List
//检索出空的矢量文件并将空的矢量文件的名称保存到List0列表中,这样可以知道那些水系是空缺的
List0=[]  #建立一个空列表,用了保存空缺水系名称
for i in List:  #循环检索矢量文件
    if arcpy.management.GetCount(i)[0] == "0":   #查找出空的矢量文件
        List0.append(i)                          #逐个将空的矢量文件名称追加到列表List0中       
print(List0)   #打印空缺水系名称列表              
                                         -- 输出结果 --
[u'\u4e03\u91cc\u6c9f.shp', u'\u4e09\u91cc\u58a9\u6c9f.shp', u'\u4e0a\u4e0b\u53e3\u6c9f.shp', u'\u4e0b\u6c34\u6c9f.shp', u'\u4e0b\u9a6c\u5cad\u6c9f.shp', u'\u4e1c\u6e7e\u6c9f.shp', u'\u4e8c\u9053\u6cb3\u4e1c\u6c9f.shp', u'\u4e94\u91cc\u6ce2\u6c9f.shp', u'\u4ed9\u6816\u6c9f.shp', u'\u4f5b\u5cea\u53e3\u6c9f.shp', u'\u5174\u9686\u53e3\u6c9f.shp', u'\u51af\u6751\u6c9f.shp', u'\u524d\u5587\u53ed\u6c9f.shp', u'\u5317\u8fd0\u6cb3\u5317\u4e09\u6cb3\u4e0b\u6e38\u533a\u57df\u6bb5.shp', u'\u5357\u77f3\u7f8a\u6c9f.shp', u'\u5357\u7a96\u6c9f.shp', u'\u53e4\u6d1e\u6c9f.shp', u'\u53f2\u5bb6\u8425\u6c9f.shp', u'\u540e\u5587\u53ed\u6c9f.shp', u'\u540e\u7126\u5bb6\u575e\u6cb3.shp', u'\u5468\u5bb6\u5df7\u6392\u6d2a\u6c9f.shp', u'\u5761\u5934\u6c9f.shp', u'\u5858\u730a\u6c9f.shp', u'\u590f\u5404\u5e84\u77f3\u6cb3.shp', u'\u5927\u5317\u6c9f.shp', u'\u5927\u5357\u6c9f.shp', u'\u5927\u5b89\u5c71\u6c9f.shp', u'\u5927\u72fc\u57a1\u6392\u6c9f.shp', u'\u5929\u95e8\u5173\u6c9f.shp', u'\u5b54\u5316\u8425\u6c9f.shp', u'\u5b5f\u7956\u6cb3.shp', u'\u5b8f\u4e30\u6392\u6c34\u6e20.shp', u'\u5b9d\u6797\u5bfa\u6cb3.shp', u'\u5bf9\u5bb6\u6cb3.shp', u'\u5c0f\u5f20\u5bb6\u53e3\u6cb3.shp', u'\u5c0f\u8f9b\u5be8\u77f3\u6cb3.shp', u'\u5c94\u77f3\u53e3\u6c9f.shp', u'\u5cea\u5b50\u6c9f.shp', u'\u5d0e\u5cf0\u8336\u4e1c\u6c9f.shp', u'\u5e2e\u6c34\u5cea\u6cb3.shp', u'\u5e3d\u5c71\u6c9f.shp', u'\u65e7\u5929\u5802\u6cb3.shp', u'\u6843\u6761\u6c9f.shp', u'\u6a31\u6843\u6c9f.shp', u'\u6c99\u5858\u6c9f.shp', u'\u6cb3\u5317\u6c9f.shp', u'\u6cbf\u6cb3\u57ce\u6c9f.shp', u'\u6d33\u6cb3\u53f3\u652f\u6cb3.shp', u'\u6e05\u6c34\u6da7\u6c9f.shp', u'\u6e29\u6805\u5b50\u6c9f.shp', u'\u6e6b\u6cb3.shp', u'\u7409\u7483\u5e99\u5357\u6c9f.shp', u'\u7530\u8425\u6392\u6c9f.shp', u'\u767d\u77f3\u6c9f.shp', u'\u7aa6\u5e97\u6c9f.shp', u'\u7bad\u6746\u6cb3\u4e0a\u6bb5.shp', u'\u7bad\u6746\u6cb3\u4e0b\u6bb5.shp', u'\u7ea2\u65d7\u7538\u6c9f.shp', u'\u8001\u51e4\u6cb3.shp', u'\u8001\u5cea\u6c9f.shp', u'\u8001\u6c9f.shp', u'\u82c7\u7538\u6c9f.shp', u'\u897f\u62e8\u5b50\u6cb3.shp', u'\u897f\u9f99\u6e7e\u6cb3.shp', u'\u897f\u9f99\u6e7e\u6cb3\u53f3\u652f\u4e00\u6cb3.shp', u'\u8fbe\u6469\u6c9f.shp', u'\u9525\u77f3\u53e3\u6c9f.shp', u'\u9752\u9f99\u6da7\u6c9f.shp', u'\u987a\u4e09\u6392\u6c34\u6e20.shp', u'\u9ad8\u4e95\u6c9f.shp', u'\u9ad8\u5d16\u53e3\u6c9f.shp', u'\u9ed1\u5c71\u5be8\u6c9f.shp', u'\u9f99\u6cb3.shp', u'\u9f99\u6f6d\u6c9f.shp', u'\u9f99\u9053\u6cb3.shp', u'\u9f99\u95e8\u6c9f.shp']
//直接print输出打印的Unicoede编码格式,这种格式不好看,可以通过for逐个循环打印就可以显示正常名称了
for i in List0:
     print(i)
                                         -- 输出结果 --
七里沟.shp
三里墩沟.shp
上下口沟.shp
下水沟.shp
下马岭沟.shp
东湾沟.shp
二道河东沟.shp
五里波沟.shp
仙栖沟.shp
佛峪口沟.shp
兴隆口沟.shp
冯村沟.shp
前喇叭沟.shp
北运河北三河下游区域段.shp
南石羊沟.shp
南窖沟.shp
古洞沟.shp
史家营沟.shp
后喇叭沟.shp
后焦家坞河.shp
周家巷排洪沟.shp
坡头沟.shp
塘猊沟.shp
夏各庄石河.shp
大北沟.shp
大南沟.shp
大安山沟.shp
大狼垡排沟.shp
天门关沟.shp
孔化营沟.shp
孟祖河.shp
宏丰排水渠.shp
宝林寺河.shp
对家河.shp
小张家口河.shp
小辛寨石河.shp
岔石口沟.shp
峪子沟.shp
崎峰茶东沟.shp
帮水峪河.shp
帽山沟.shp
旧天堂河.shp
桃条沟.shp
樱桃沟.shp
沙塘沟.shp
河北沟.shp
沿河城沟.shp
洳河右支河.shp
清水涧沟.shp
温栅子沟.shp
湫河.shp
琉璃庙南沟.shp
田营排沟.shp
白石沟.shp
窦店沟.shp
箭杆河上段.shp
箭杆河下段.shp
红旗甸沟.shp
老凤河.shp
老峪沟.shp
老沟.shp
苇甸沟.shp
西拨子河.shp
西龙湾河.shp
西龙湾河右支一河.shp
达摩沟.shp
锥石口沟.shp
青龙涧沟.shp
顺三排水渠.shp
高井沟.shp
高崖口沟.shp
黑山寨沟.shp
龙河.shp
龙潭沟.shp
龙道河.shp
龙门沟.shp                      
// 检索出空缺文件直接删除(注意,这一部分代码直接就把文件删除了,假如想知道哪些空缺,一定先运行上面的代码),将上面代码中for循环的语句改为
for i in List:  #循环检索矢量文件
    if arcpy.management.GetCount(i)[0] == "0":   #查找出空的矢量文件
    	arcpy.Delete_management(i)

拓展的知识及应用分析

快速获取文件夹中的所有矢量文件和栅格文件名称

矢量文件

快速获取某个文件夹中的矢量数据名称(.shp),并制作文件路径,一般我们在软件中导入矢量数据中选择打开.shp文件
一般打开文件夹我们发现一个矢量文件包含多个后缀的文件名称,如下图
【利用Arcpy快速检索矢量文件和栅格文件并进行统计和删除工作】_第2张图片

我们从Arcatalog中查看的时候只有.shp的文件,如下图
【利用Arcpy快速检索矢量文件和栅格文件并进行统计和删除工作】_第3张图片
这不能说明其他格式文件不重要,每一个文件都是矢量文件的重要部分。Shapefile文件指的是一种文件存储的方法,实际上该种文件格式是由多个文件组成的。其中,要组成一个Shapefile,有三个文件是必不可少的,它们分别是".shp", ".shx"与 “.dbf” 文件,也会包含.prj和.shp.xml格式等,其分别代表的含义如下

.shp — 图形格式,用于保存元素的几何实体。
.shx — 图形索引格式。几何体位置索引,记录每一个几何体在shp文件之中的位置,能够加快向前或向后搜索一个几何体的效率。
.dbf — 属性数据格式,以dBase IV的数据表格式存储每个几何形状的属性数据。
.prj — 投影格式,用于保存地理坐标系统与投影信息,是一个存储well-known text投影描述符的文本文件。
.shp.xml — 以XML格式保存元数据。

有一些文件还会包含.sbn、.sbx、.lock文件,像下面这个文件
【利用Arcpy快速检索矢量文件和栅格文件并进行统计和删除工作】_第4张图片

.sbn and .sbx — 几何体的空间索引
.lock—一般加载到Arcmap中之后会生成的.lock文件

言归正传了,接下来上代码

// 导入包
import os
import arcpy
arcpy.env.workspace=r"矢量数据所在的文件夹"  #设置当前的文件夹为默认路径
List=arcpy.ListFeatureClasses()  #读取当前默认文件夹下的所有要素类(shp文件)名称,并保存为一个列表传给参数List
for i in List:
	print(i)
                                         -- 输出结果 --
七里沟.shp
万泉河.shp
三里墩沟.shp
三里河.shp
上下口沟.shp
下水沟.shp
下马岭沟.shp
东沙河.shp
东沟.shp
东湾沟.shp
中坝河.shp
二道河东沟.shp
五里波沟.shp
亮马河.shp
仙栖沟.shp
佛峪口沟.shp
六股道沟.shp
//若想制作文件夹路可以参考一下代码
for i in List:
	print("C:\\Users\\yangjin\\"+i)
                                         -- 输出结果 --	
C:\Users\yangjin\七里沟.shp
C:\Users\yangjin\万泉河.shp
C:\Users\yangjin\三里墩沟.shp
C:\Users\yangjin\三里河.shp
C:\Users\yangjin\上下口沟.shp
C:\Users\yangjin\下水沟.shp
C:\Users\yangjin\下马岭沟.shp
C:\Users\yangjin\东沙河.shp
C:\Users\yangjin\东沟.shp
C:\Users\yangjin\东湾沟.shp
C:\Users\yangjin\中坝河.shp
C:\Users\yangjin\二道河东沟.shp
C:\Users\yangjin\五里波沟.shp
C:\Users\yangjin\亮马河.shp
C:\Users\yangjin\仙栖沟.shp
C:\Users\yangjin\佛峪口沟.shp
C:\Users\yangjin\六股道沟.shp

栅格文件

// 栅格文件名称读取代码如下,其他导入包和默认环境可参考矢量文件名称读取
var foo = 'List=arcpy.ListRasters()';

输出结果如下图
【利用Arcpy快速检索矢量文件和栅格文件并进行统计和删除工作】_第5张图片

快速数据库中的矢量文件和栅格文件名称

在arcmap中还可用到数据库管理文件(.gdb),为了方便对数据进行管理,下图zonal.gdb数据库里面包含矢量数据beijing,还有其他4个栅格数据。
【利用Arcpy快速检索矢量文件和栅格文件并进行统计和删除工作】_第6张图片
在数据库中读取矢量和栅格文件与在文件中读取的方法代码一致,只需把默认路径设置为数据库的路径即可
补充:
(1)假如想要知道文件夹或者数据库中包含多少个矢量文件和栅格文件,可以用len()语句查看列表中有多少个元素即可
(2)假如想要读取文件夹或者数据库中有特定前缀和后缀的文件,可以在for循环下面加if判断语句对文件进行一个筛选。

快速读取每个矢量文件中都包含多少个对象

首先,参考上面代码,先将读取的矢量文件名称建立一个列表List(也可以自己定义其他名字),然后可以参考查询文件中空矢量文件的代码了,先建立一个空的列表[a,d],不同的是这个需要建立二维列表,a为记录矢量文件名称,b为对应矢量包含的对象个数。
导入包、设置默认环境以及建立文件名称列表的代码可参考上面代码,接下来代码如下

Count=[]  #建立一个空列表
for i in List:
	cou=arcpy.management.GetCount(i)[0]   #统计矢量文件中有多少个对象
	name=os.path.splitext(i)[0] + '\n' #去掉.shp后缀,若是读取的数据库文件不用加此步
	zuhe=[name,cou]      #将文件名称和统计的对象个数组成一个列表
	Count.append(zuhe)   #将组合的列表依次追加到Count列表中
//打印输出结果
for i in Count:
	print(i[0])
	print(i[1])
                                         -- 输出结果 --	
万泉河

1
三里河

5
东沙河

2
东沟

4
中坝河

2
亮马河

3
六股道沟

2
凉水河

1
凤河

12

补充—检索文件中以“ ”开头,以“ ”结尾的文件名

以下代表检索以“bio”,以“.tif”结束的文件名。
for i in List:
… if i.startswith(“bio”) and i.endswith(“.tif”):
… print(i)

结语

检索文件并将其名称保存为列表,是基于Arcpy进行批量处理和分析的一个重要环节,因为批量处理的核心思想是通过for循环文件实现数据循环处理分析,最常用的就是用for循环要处理的文件路径列表,因此循环语句是批处理的核心,文件路径列表是进行for循环的关键。

你可能感兴趣的:(Arcpy批量数据处理,python)