基于Python的地理遥感图像批量处理----切割

实现LinkShp切割及转成PolyShp

  • 调用shapefile库,创建读写LinkShp文件对象,创建写入PolyShp文件对象
  • baseLinkPoint = [[list(i) for i in rLinkShp.shape(0).points]] 得到LinkShp属性表的第一个要素
  • 使用wPolyShp.poly(baseLinkPoint) 方法,将baseLinkPoint写入wPolyShp对象中
  • 由于使用这种方法不会生成投影文件(.prj),所以我要额外复制的prj文件到里面
import shapefile, os, shutil

if __name__ == '__main__':
    '''设置基本路径变量'''
    # 原文件 夹 存放地址
    folderBaseMap = r'Z:\XXX\yyyy\zzz\aaaLink'
    # 目标文件 夹 存放地址
    folderPolyAimMap = r'Z:\XXX\yyyy\zzz\aaaPoly'
    # 原文件的投影地址
    projectionFile = r'Z:\XXX\yyyy\zzz\1_0.prj'
    print('Start...')

    '''获得预测地块的线shp文件夹名和文件'''
    for folderName, subFolders, filesNames in os.walk(folderBaseMap):
        # 相对路径,相同则为'.',添加在folderPolyAimMap上
        newFolderRelpath = os.path.relpath(folderName, folderBaseMap)
        # 获得目标文件路径
        newFolderPolyAimMap = fr'{folderPolyAimMap}\{newFolderRelpath}'

        # 判断是否为基文件夹、目标文件夹已经存在
        if newFolderRelpath == '.' or os.path.exists(newFolderPolyAimMap):
            continue
        ## 根据文件夹名在folderLinkAimMap下生成相应的文件夹名
        os.makedirs(newFolderPolyAimMap)
        print(folderName)
        for fileName in filesNames:
            if os.path.splitext(fileName)[1] == '.shp':
                print(fileName)
                # 原Shp文件地址
                baseLinkMap = fr'{folderName}\{fileName}'
                # 目标Shp文件地址
                aimPolyMap = fr'{newFolderPolyAimMap}\{fileName}'
                # 创建读取原文件对象
                rLinkShp = shapefile.Reader(baseLinkMap)
                # 创建写目标文件对象, target为存放路径, shapeType表示shp类型,5为面文件
                wPolyShp = shapefile.Writer(target=aimPolyMap, shapeType=5)
                # 添加名为'Size'的浮点型,6位有效,2位小数点的字段
                wPolyShp.field('Size', 'F', 6, 2)
                # 读取原文件第一个要素的线点集
                # 添加异常处理,以防存在空Shp文件
                try:
                    baseLinkPoint = [[list(i) for i in rLinkShp.shape(0).points]]
                except IndexError:
                    shutil.copy(projectionFile, f'{aimPolyMap[:-4]}.prj')
                    continue
                # 将线点集写入到面点击中
                wPolyShp.poly(baseLinkPoint)
                # 随意写入一个面积信息
                wPolyShp.record(1.1)
                # 关闭写文件
                wPolyShp.close()
                # 这里偷懒,已知'.shp'这个字符串的len
                shutil.copy(projectionFile, f'{aimPolyMap[:-4]}.prj')
        print(folderName, '已经完成')
    print('End...')

效果:
InputLinkShp文件
Output
PolyShp文件

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值