python gdal矢量轉柵格

# -*- 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'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章