需求
分析不同年份土地利用类型的变化。
思路
1、准备要对比的不同年份的数据
2、从文件夹中分别读取不同年份每个小类的shp文件
3、将不同年份相同小类的图层的属性放到一个图层里(union)
4、在union生成的结果中新增字段(change)
5、使用字段计算器,给新增字段赋值,如果属性没变,就赋值为1,如果属性变化了就赋值为0
6、按照属性选择发生变化的要素,最终输出结果文件
方法
- os.listdir()——用于返回指定的文件夹包含的文件或文件夹的名字的列表
- os.path.splitext()——分离文件名与扩展名
- append() ——用于在列表末尾添加新的对象
- arcpy.ListFeatureClasses() ——列出工作空间中的要素类
- arcpy.Union_analysis() ——计算输入要素的几何并集,将要素及其属性都写入输出要素类
- arcpy.CreateFileGDB_management() ——创建文件地理数据库
- arcpy.ListFields() ——列出指定数据集中的要素类、shapefile 或表中的字段
- arcpy.AddField_management() ——向表或要素类表、要素图层、栅格目录或带属性表的栅格添加新字段
- arcpy.CalculateField_management() ——为要素类、要素图层或栅格计算字段的值
- arcpy.FeatureClassToGeodatabase_conversion() ——将一个或多个要素类/要素图层转换为地理数据库要素类
- arcpy.MakeFeatureLayer_management() ——创建要素图层
- arcpy.SelectLayerByAttribute_management() ——基于属性查询在图层或表视图中添加、更新或移除选择内容
- arcpy.CopyFeatures_management() ——将输入要素类或图层中的要素复制到新要素类
详解
1、os.listdir()
用于返回指定的文件夹包含的文件或文件夹的名字的列表。
os.listdir(new_shp_file_path) # 列出shp_file_path这个路径下的所有文件
如果目录下有中文,需要先进行转码处理:
new_shp_file_path = shp_file_path.decode('utf-8')
2、os.path.splitext()
分离文件名与扩展名,以最后一个.来区分扩展名
os.path.splitext(file)[0] 获得文件名
os.path.splitext(file)[1] 获得文件扩展名
os.path.splitext("D:/土地利用2017.gdb")[0] # D:/土地利用2017
os.path.splitext("D:/土地利用2017.gdb")[1] # .gdb
os.path.splitext("D:/土地利用2017.gdb.shp")[0] # D:/土地利用2017.gdb
os.path.splitext("D:/土地利用2017.gdb.shp")[1] # .shp
3、append()
append() 方法用于在列表末尾添加新的对象,无返回值,会修改原来的列表
aList = [123, 'xyz', 'zara', 'abc'];
aList.append( 2009 ); # alist = [123, 'xyz', 'zara', 'abc', 2009]
4、arcpy.ListFeatureClasses()
列出工作空间中的要素类
5、arcpy.Union_analysis()
计算输入要素的几何并集。将所有要素及其属性都写入输出要素类
![image.png](https://img-blog.csdnimg.cn/img_convert/dce759fe17e671f6841dc6daf92cf303.png#align=left&display=inline&height=245&margin=[object Object]&name=image.png&originHeight=245&originWidth=469&size=12726&status=done&style=none&width=469)
arcpy.Union_analysis (inFeatures, outFeatures, "ALL")
6、arcpy.CreateFileGDB_management()
arcpy.CreateFileGDB_management(out_gdb_path,out_gdb_name)
# 在指定目录中创建了文件地理数据库,如果输出地理数据库名称不包含 .gdb 扩展名,则会添加这样一个扩展名
7、arcpy.ListFields()
arcpy.ListFields(new_item_path)
# 指定的要素类或表的字段名称列表
8、arcpy.AddField_management()
arcpy.AddField_management(new_item_path,name_space,'SHORT')
# new_item_path :要添加指定字段的输入表
# name_space :新增的字段名
# SHORT :新字段的字段类型,
9、arcpy.CalculateField_management()
arcpy.CalculateField_management(new_item_path, name_space, expression, 'PYTHON_9.3')
# new_item_path :文件路径
# name_space :新增的字段名
# expression : 赋值运算的表达式
# PYTHON_9.3 :指定要使用的表达式的类型
"""
VB —表达式将使用标准 VB 格式编写,默认设置,64 位产品不支持
PYTHON —表达式将使用标准 Python 格式编写。地理处理器方法和属性的使用与创建 9.2 版地理处理器相同
PYTHON_9.3 —表达式将使用标准 Python 格式编写。地理处理器方法和属性的使用与创建 9.3 版地理处理器相同
"""
10、arcpy.FeatureClassToGeodatabase_conversion()
arcpy.FeatureClassToGeodatabase_conversion(new_item_path,out_location)
11、arcpy.MakeFeatureLayer_management()
根据输入要素类或图层文件创建要素图层。该工具创建的图层是临时图层,如果不将此图层保存到磁盘或保存地图文档,该图层在会话结束后将不会继续存在。
arcpy.MakeFeatureLayer_management(item_name, lyr_name)
12、arcpy.SelectLayerByAttribute_management()
arcpy.SelectLayerByAttribute_management(lyr_name, 'NEW_SELECTION', condition)
# NEW_SELECTION —生成的选择内容将替换任何现有选择内容,默认设置
其他属性
输入必须为要素图层或表视图。不能使用要素类或表作为输入。
13、arcpy.CopyFeatures_management()
将输入要素类或图层中的要素复制到新要素类。如果输入是具有选定内容的图层,则仅复制所选要素。如果输入是地理数据库要素类或 shapefile,则会复制所有要素。
arcpy.CopyFeatures_management(lyr_name,out_path)
补充
- Python将反斜线 () 用作转义字符。例如,\n 表示换行符,\t 表示制表符。指定路径时,可使用正斜线 (/) 代替反斜线。使用两条反斜线(而不是一条)以避免语法错误。也可通过在包含反斜线的字符串前放置字母 r(以便正确解释)来使用字符串文本。