实现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...')
效果:
Input
Output