import gdal
from gdal import gdalconst
from osgeo import gdalconst, gdal, ogr, osr
import numpy as np
import os
import glob, threading
def vector2raster_line(inputfilePath, outputfile, templatefile):
inputfilePath = inputfilePath
outputfile = outputfile
templatefile = templatefile
data = gdal.Open(templatefile, gdalconst.GA_ReadOnly)
x_res = data.RasterXSize
y_res = data.RasterYSize
vector = ogr.Open(inputfilePath)
layer = vector.GetLayer()
targetDataset = gdal.GetDriverByName('GTiff').Create(outputfile, x_res, y_res, 3, gdal.GDT_Byte)
targetDataset.SetGeoTransform(data.GetGeoTransform())
targetDataset.SetProjection(data.GetProjection())
band = targetDataset.GetRasterBand(1)
NoData_value = -999
band.SetNoDataValue(NoData_value)
band.FlushCache()
gdal.RasterizeLayer(targetDataset, [1, 2, 3], layer, )
def raster2vector_line(inputfile_dir, outfile_dir):
inputfile = inputfile_dir
ds = gdal.Open(inputfile, gdal.GA_ReadOnly)
srcband = ds.GetRasterBand(1)
maskband = srcband.GetMaskBand()
outfile = outfile_dir
drv = ogr.GetDriverByName('ESRI Shapefile')
dst_ds = drv.CreateDataSource(outfile)
srs = None
dst_layer = dst_ds.CreateLayer(outfile, srs=srs)
dst_fieldname = 'DN'
fd = ogr.FieldDefn(dst_fieldname, ogr.OFTInteger)
dst_layer.CreateField(fd)
dst_field = 0
options = []
gdal.Polygonize(srcband, maskband, dst_layer, dst_field, options)
def raster2poly(raster, outshp):
inraster = gdal.Open(raster) # 读取路径中的栅格数据
inband = inraster.GetRasterBand(1) # 这个波段就是最后想要转为矢量的波段,如果是单波段数据的话那就都是1
prj = osr.SpatialReference()
prj.ImportFromWkt(inraster.GetProjection()) # 读取栅格数据的投影信息,用来为后面生成的矢量做准备
drv = ogr.GetDriverByName("ESRI Shapefile")
if os.path.exists(outshp): # 若文件已经存在,则删除它继续重新做一遍
drv.DeleteDataSource(outshp)
Polygon = drv.CreateDataSource(outshp) # 创建一个目标文件
Poly_layer = Polygon.CreateLayer(raster[:-4], srs=prj, geom_type=ogr.wkbMultiPolygon) # 对shp文件创建一个图层,定义为多个面类
newField = ogr.FieldDefn('value', ogr.OFTReal) # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
Poly_layer.CreateField(newField)
gdal.FPolygonize(inband, None, Poly_layer, 0) # 核心函数,执行的就是栅格转矢量操作
Polygon.SyncToDisk()
Polygon = None
if __name__=="__main__":
img_dir = r"C:\Users\Administrator\Desktop\target maps\*"
save_dir = r"C:\Users\Administrator\Desktop\shape_file/"
img_list = glob.glob(img_dir)
for i in range(len(img_list)):
img = img_list[i]
save_img = save_dir+img.split("\\")[-1][:-4] + ".shp"
# threading.Thread(target=raster2vector_line, args=(img, save_img)).start()
raster2poly(img, save_img)