def createRasterFromGeoJson(srcGeoJson, srcRasterFileName, outRasterFileName):
NoData_value = 0
source_ds = ogr.Open(srcGeoJson)
source_layer = source_ds.GetLayer()
srcRaster = gdal.Open(srcRasterFileName)
# Create the destination data source
target_ds = gdal.GetDriverByName('GTiff').Create(outRasterFileName, srcRaster.RasterXSize, srcRaster.RasterYSize, 1, gdal.GDT_Byte)
target_ds.SetGeoTransform(srcRaster.GetGeoTransform())
target_ds.SetProjection(srcRaster.GetProjection())
band = target_ds.GetRasterBand(1)
band.SetNoDataValue(NoData_value)
# Rasterize
gdal.RasterizeLayer(target_ds, [1], source_layer, burn_values=[1])
band.FlushCache()
python类GDT_Byte()的实例源码
def rasterize(self,inRaster,inShape,inField):
filename = tempfile.mktemp('.tif')
data = gdal.Open(inRaster,gdal.GA_ReadOnly)
shp = ogr.Open(inShape)
lyr = shp.GetLayer()
driver = gdal.GetDriverByName('GTiff')
dst_ds = driver.Create(filename,data.RasterXSize,data.RasterYSize, 1,gdal.GDT_Byte)
dst_ds.SetGeoTransform(data.GetGeoTransform())
dst_ds.SetProjection(data.GetProjection())
OPTIONS = 'ATTRIBUTE='+inField
gdal.RasterizeLayer(dst_ds, [1], lyr, None,options=[OPTIONS])
data,dst_ds,shp,lyr=None,None,None,None
return filename
def createImageDS(filename, x_min, y_min, x_max, y_max, pixel_size, srs=None):
# Create the destination data source
x_res = int((x_max - x_min) / pixel_size) # resolution
y_res = int((y_max - y_min) / pixel_size) # resolution
ds = gdal.GetDriverByName('GTiff').Create(filename, x_res,
y_res, 1, gdal.GDT_Byte)
ds.SetGeoTransform((
x_min, pixel_size, 0,
y_max, 0, -pixel_size,
))
if srs:
# Make the target raster have the same projection as the source
ds.SetProjection(srs.ExportToWkt())
else:
# Source has no projection (needs GDAL >= 1.7.0 to work)
ds.SetProjection('LOCAL_CS["arbitrary"]')
# Set nodata
band = ds.GetRasterBand(1)
band.SetNoDataValue(0)
return ds
def create_gpkg(
gpkg_name, proj_string, size=(1, 1), geotransform=[0, 1, 0, 0, 0, -1],
creation_options=None
):
if os.path.exists("%s.gpkg" % gpkg_name):
sys.stderr.write(
"ERROR: SQLite GeoPackage '%s.gpkg' already exists.\n" % gpkg_name
)
sys.exit(1)
gdal.AllRegister()
drv = gdal.GetDriverByName("GPKG")
try:
gpkg = drv.Create(
"%s.gpkg" % gpkg_name, size[0], size[1], 1, gdal.GDT_Byte,
creation_options
)
proj = osr.SpatialReference()
res = proj.SetWellKnownGeogCS(proj_string)
if res != 0:
if proj_string[0:4] == 'EPSG':
proj.ImportFromEPSG(int(proj_string[5:]))
gpkg.SetProjection(proj.ExportToWkt())
gpkg.SetGeoTransform(geotransform)
gpkg = None
except Exception as e:
sys.stderr.write(
"ERROR: Cannot create SQLite GeoPackage '%s.gpkg'. "
"Error message was: '%s'.\n" % (gpkg_name, e.message)
)
sys.exit(1)
classify.py 文件源码
项目:python_scripting_for_spatial_data_processing
作者: upsdeepak
项目源码
文件源码
阅读 30
收藏 0
点赞 0
评论 0
def write_geotiff(fname, data, geo_transform, projection, data_type=gdal.GDT_Byte):
"""
Create a GeoTIFF file with the given data.
:param fname: Path to a directory with shapefiles
:param data: Number of rows of the result
:param geo_transform: Returned value of gdal.Dataset.GetGeoTransform (coefficients for
transforming between pixel/line (P,L) raster space, and projection
coordinates (Xp,Yp) space.
:param projection: Projection definition string (Returned by gdal.Dataset.GetProjectionRef)
"""
driver = gdal.GetDriverByName('GTiff')
rows, cols = data.shape
dataset = driver.Create(fname, cols, rows, 1, data_type)
dataset.SetGeoTransform(geo_transform)
dataset.SetProjection(projection)
band = dataset.GetRasterBand(1)
band.WriteArray(data)
ct = gdal.ColorTable()
for pixel_value in range(len(classes)+1):
color_hex = COLORS[pixel_value]
r = int(color_hex[1:3], 16)
g = int(color_hex[3:5], 16)
b = int(color_hex[5:7], 16)
ct.SetColorEntry(pixel_value, (r, g, b, 255))
band.SetColorTable(ct)
metadata = {
'TIFFTAG_COPYRIGHT': 'CC BY 4.0',
'TIFFTAG_DOCUMENTNAME': 'classification',
'TIFFTAG_IMAGEDESCRIPTION': 'Supervised classification.',
'TIFFTAG_MAXSAMPLEVALUE': str(len(classes)),
'TIFFTAG_MINSAMPLEVALUE': '0',
'TIFFTAG_SOFTWARE': 'Python, GDAL, scikit-learn'
}
dataset.SetMetadata(metadata)
dataset = None # Close the file
return
def create_raster(xsize, ysize, driver='MEM',tmpfile='', gt=None, srs_wkt=None, nodata=None, init=None, datatype=gdal.GDT_Byte):
# Create a memory raster to rasterize into.
out_ds = gdal.GetDriverByName(driver).Create(tmpfile, xsize, ysize, 1 ,datatype)
if init is not None:out_ds.GetRasterBand(1).Fill(init)
if nodata is not None:out_ds.GetRasterBand(1).SetNoDataValue(nodata)
if gt:out_ds.SetGeoTransform(gt)
if srs_wkt:out_ds.SetProjection(srs_wkt)
return out_ds
def shp2array(shp_fn, r_ds=None, res=None, extent=None, t_srs=None):
"""Rasterize input shapefile to match existing raster Dataset (or specified res/extent/t_srs)
"""
shp_ds = ogr.Open(shp_fn)
lyr = shp_ds.GetLayer()
#This returns xmin, ymin, xmax, ymax
shp_extent = lyr_extent(lyr)
shp_srs = lyr.GetSpatialRef()
# dst_dt = gdal.GDT_Byte
ndv = 0
if r_ds is not None:
r_extent = ds_extent(r_ds)
res = get_res(r_ds, square=True)[0]
if extent is None:
extent = r_extent
r_srs = get_ds_srs(r_ds)
r_geom = ds_geom(r_ds)
# dst_ns = r_ds.RasterXSize
# dst_nl = r_ds.RasterYSize
#Convert raster extent to shp_srs
cT = osr.CoordinateTransformation(r_srs, shp_srs)
r_geom_reproj = geom_dup(r_geom)
r_geom_reproj.Transform(cT)
r_geom_reproj.AssignSpatialReference(t_srs)
lyr.SetSpatialFilter(r_geom_reproj)
#lyr.SetSpatialFilter(ogr.CreateGeometryFromWkt(wkt))
else:
#TODO: clean this up
if res is None:
sys.exit("Must specify input res")
if extent is None:
print("Using input shp extent")
extent = shp_extent
if t_srs is None:
t_srs = r_srs
if not shp_srs.IsSame(t_srs):
print("Input shp srs: %s" % shp_srs.ExportToProj4())
print("Specified output srs: %s" % t_srs.ExportToProj4())
out_ds = lyr_proj(lyr, t_srs)
outlyr = out_ds.GetLayer()
else:
outlyr = lyr
#outlyr.SetSpatialFilter(r_geom)
m_ds = mem_ds(res, extent, srs=t_srs, dtype=gdal.GDT_Byte)
b = m_ds.GetRasterBand(1)
b.SetNoDataValue(ndv)
gdal.RasterizeLayer(m_ds, [1], outlyr, burn_values=[1])
a = b.ReadAsArray()
a = ~(a.astype('Bool'))
return a
def open_data(filename):
'''
The function open and load the image given its name.
The type of the data is checked from the file and the scipy array is initialized accordingly.
Input:
filename: the name of the file
Output:
im: the data cube
GeoTransform: the geotransform information
Projection: the projection information
'''
data = gdal.Open(filename,gdal.GA_ReadOnly)
if data is None:
print 'Impossible to open '+filename
exit()
nc = data.RasterXSize
nl = data.RasterYSize
d = data.RasterCount
# Get the type of the data
gdal_dt = data.GetRasterBand(1).DataType
if gdal_dt == gdal.GDT_Byte:
dt = 'uint8'
elif gdal_dt == gdal.GDT_Int16:
dt = 'int16'
elif gdal_dt == gdal.GDT_UInt16:
dt = 'uint16'
elif gdal_dt == gdal.GDT_Int32:
dt = 'int32'
elif gdal_dt == gdal.GDT_UInt32:
dt = 'uint32'
elif gdal_dt == gdal.GDT_Float32:
dt = 'float32'
elif gdal_dt == gdal.GDT_Float64:
dt = 'float64'
elif gdal_dt == gdal.GDT_CInt16 or gdal_dt == gdal.GDT_CInt32 or gdal_dt == gdal.GDT_CFloat32 or gdal_dt == gdal.GDT_CFloat64 :
dt = 'complex64'
else:
print 'Data type unkown'
exit()
# Initialize the array
if d == 1:
im = sp.empty((nl,nc),dtype=dt)
else:
im = sp.empty((nl,nc,d),dtype=dt)
if d == 1:
im[:,:]=data.GetRasterBand(1).ReadAsArray()
else :
for i in range(d):
im[:,:,i]=data.GetRasterBand(i+1).ReadAsArray()
GeoTransform = data.GetGeoTransform()
Projection = data.GetProjection()
data = None
return im,GeoTransform,Projection
def write_data(outname,im,GeoTransform,Projection):
'''
The function write the image on the hard drive.
Input:
outname: the name of the file to be written
im: the image cube
GeoTransform: the geotransform information
Projection: the projection information
Output:
Nothing --
'''
nl = im.shape[0]
nc = im.shape[1]
if im.ndim == 2:
d=1
else:
d = im.shape[2]
driver = gdal.GetDriverByName('GTiff')
dt = im.dtype.name
# Get the data type
if dt == 'bool' or dt == 'uint8':
gdal_dt=gdal.GDT_Byte
elif dt == 'int8' or dt == 'int16':
gdal_dt=gdal.GDT_Int16
elif dt == 'uint16':
gdal_dt=gdal.GDT_UInt16
elif dt == 'int32':
gdal_dt=gdal.GDT_Int32
elif dt == 'uint32':
gdal_dt=gdal.GDT_UInt32
elif dt == 'int64' or dt == 'uint64' or dt == 'float16' or dt == 'float32':
gdal_dt=gdal.GDT_Float32
elif dt == 'float64':
gdal_dt=gdal.GDT_Float64
elif dt == 'complex64':
gdal_dt=gdal.GDT_CFloat64
else:
print 'Data type non-suported'
exit()
dst_ds = driver.Create(outname,nc,nl, d, gdal_dt)
dst_ds.SetGeoTransform(GeoTransform)
dst_ds.SetProjection(Projection)
if d==1:
out = dst_ds.GetRasterBand(1)
out.WriteArray(im)
out.FlushCache()
else:
for i in range(d):
out = dst_ds.GetRasterBand(i+1)
out.WriteArray(im[:,:,i])
out.FlushCache()
dst_ds = None