# -*- coding: utf-8 -*-
import os
import numpy as np
import gdal
import re
import time
#import arcpy
imagefile="D:/0220/605611/1/mask.tif" #參考圖像,裏面有座標系需要用到
line_file = "D:/0220/605611/1/t.shp" #需要轉的矢量數據
outraster_file = "D:/0220/605611/1/road_temp.tif" #存儲的結果
# fields1 = [f1.name for f1 in arcpy.ListFields(line_file)]
field_name='FID_1'
# field_name='FID_1'
# if 'FID_1' in fields1:
# arcpy.CalculateField_management(line_file,'FID_1',1,"PYTHON_9.3")
# if 'FID_1' not in fields1:
# arcpy.AddField_management(line_file,'FID_1',"SHORT",'','',10)
# arcpy.CalculateField_management(line_file,'FID_1',1,"PYTHON_9.3")
image=gdal.Open(imagefile)
width=image.RasterXSize
height=image.RasterYSize
geotransform=image.GetGeoTransform()
ref=image.GetProjection()
xmin=geotransform[0]
xmax=xmin+geotransform[1]*image.RasterXSize
ymax=geotransform[3]
ymin=ymax+geotransform[5]*image.RasterYSize
opt={'format':"GTiff",'width':image.RasterXSize,'height':image.RasterYSize,'initValues':0,'attribute':field_name}
gdal.Rasterize(outraster_file,line_file,**opt)
print("success")
img = gdal.Open(outraster_file)
data=img.GetRasterBand(1).ReadAsArray().astype(np.uint8)
data[np.where(data>0)]=255
driver = gdal.GetDriverByName("GTiff")
ds = driver.Create(outraster_file,image.RasterXSize,image.RasterYSize,1,gdal.GDT_Byte)
ds.SetGeoTransform(geotransform)
ds.SetProjection(ref)
ds.GetRasterBand(1).WriteArray(data)
ds=None
print outraster_file + ' success'
注意:註釋的部分是在你安裝了arcgis並且配置了arcpy的情況下用的,如果你沒有arcgis想用純的gdal實現這個那麼你需要在你的矢量文件裏(上面的line_file)創建一個字段並且字段都賦值爲1就行了,或者自己去搜索一下怎麼用gdal穿件一個地段。
補充純gdal實現上面的過程:
# -*- coding: utf-8 -*-
import os
import numpy as np
import gdal
from osgeo import ogr
import re
import time
imagefile="D:/0220/605611/1/mask.tif"
line_file = "D:/0220/605611/1/t.shp"
outraster_file = "D:/0220/605611/1/road_temp.tif"
field_name="FieldID"
ds = ogr.Open(line_file, 1)
oLayer = ds.GetLayerByIndex(0)
print(oLayer.GetGeomType()) #矢量類型,輸出的是1,2,3(點、線、面)
oDefn = oLayer.GetLayerDefn()
#這裏可以不管,這部分是獲取字段的名稱,遍歷名稱以及他們的屬性的
iFieldCount = oDefn.GetFieldCount()
for iAttr in range(iFieldCount):
oField =oDefn.GetFieldDefn(iAttr)
# print(oField.GetNameRef(),
# oField.GetFieldTypeName(oField.GetType()),
# oField.GetWidth(),
# oField.GetPrecision())
#這裏是創建字段的過程,這裏是一個一個創建的,直接全部創建的沒時間找,你們看到了麻煩評論告訴我下
oFieldID =ogr.FieldDefn(field_name, ogr.OFTInteger)
oLayer.CreateField(oFieldID, 1)
fieldIndex0 = oDefn.GetFieldIndex(field_name)
for i in range(0,oLayer.GetFeatureCount()):
feature = oLayer.GetFeature(i)
value= 1 #創建的每個值都等於1
feature.SetField(fieldIndex0,value)
oLayer.SetFeature(feature)
feature.Destroy()
ds.Destroy()
image=gdal.Open(imagefile)
width=image.RasterXSize
height=image.RasterYSize
geotransform=image.GetGeoTransform()
ref=image.GetProjection()
xmin=geotransform[0]
xmax=xmin+geotransform[1]*image.RasterXSize
ymax=geotransform[3]
ymin=ymax+geotransform[5]*image.RasterYSize
opt={'format':"GTiff",'width':image.RasterXSize,'height':image.RasterYSize,'initValues':0,'attribute':field_name}
gdal.Rasterize(outraster_file,line_file,**opt)
print("success")
img = gdal.Open(outraster_file)
data=img.GetRasterBand(1).ReadAsArray().astype(np.uint8)
data[np.where(data>0)]=255
driver = gdal.GetDriverByName("GTiff")
ds = driver.Create(outraster_file,image.RasterXSize,image.RasterYSize,1,gdal.GDT_Byte)
ds.SetGeoTransform(geotransform)
ds.SetProjection(ref)
ds.GetRasterBand(1).WriteArray(data)
ds=None
print outraster_file + ' success'