Source code for flusstools.geotools.dataset_mgmt
from .raster_mgmt import *
from .shp_mgmt import *
gdal.UseExceptions()
[docs]def coords2offset(geo_transform, x_coord, y_coord):
""" Returns x-y pixel offset (inverse of the ``offset2coords`` function).
Args:
geo_transform: osgeo.gdal.Dataset.GetGeoTransform() object
x_coord (float): x-coordinate
y_coord (float): y-coordinate
Returns:
tuple: Number of pixels ``(offset_x, offset_y)``, both ``int`` .
"""
try:
origin_x = geo_transform[0]
origin_y = geo_transform[3]
pixel_width = geo_transform[1]
pixel_height = geo_transform[5]
except IndexError:
logging.error("Invalid geo_transform object (%s)." %
str(geo_transform))
return None
try:
offset_x = int((x_coord - origin_x) / pixel_width)
offset_y = int((y_coord - origin_y) / pixel_height)
except ValueError:
logging.error(
"geo_transform tuple contains non-numeric data: %s" % str(geo_transform))
return None
return offset_x, offset_y
[docs]def get_layer(dataset, band_number=1):
"""Gets a ``layer=band`` (``RasterDataSet``) or ``layer=ogr.Dataset.Layer`` of any dataset.
Args:
dataset (``osgeo.gdal.Dataset`` or ``osgeo.ogr.DataSource``): Either a raster or a shapefile.
band_number (int): Only use with rasters to define a band number to open (default is ``1`` ).
Returns:
dict: ``{"type": raster`` or ``vector`` or ``"None", layer":`` if raster: ``raster_band``, if vector: ``GetLayer()``, else: ``None}``
"""
if verify_dataset(dataset) == "raster":
return {"type": "raster", "layer": dataset.GetRasterBand(band_number)}
if verify_dataset(dataset) == "vector":
return {"type": "vector", "layer": dataset.GetLayer()}
return {"type": "None", "layer": None}
[docs]def offset2coords(geo_transform, offset_x, offset_y):
"""Returns x-y coordinates from pixel offset (inverse of ``coords2offset`` function).
Args:
geo_transform (osgeo.gdal.Dataset.GetGeoTransform): The geo transformation to use.
offset_x (int): x number of pixels.
offset_y (int): y number of pixels.
Returns:
tuple: Two ``float`` numbers of x-y-coordinates ``(x_coord, y_coord)``.
"""
try:
origin_x = geo_transform[0]
origin_y = geo_transform[3]
pixel_width = geo_transform[1]
pixel_height = geo_transform[5]
except IndexError:
logging.error("Invalid geo_transform object (%s)." %
str(geo_transform))
return None
try:
coord_x = origin_x + pixel_width * (offset_x + 0.5)
coord_y = origin_y + pixel_height * (offset_y + 0.5)
except ValueError:
logging.error(
"geo_transform tuple contains non-numeric data: %s" % str(geo_transform))
return None
return coord_x, coord_y
[docs]def verify_dataset(dataset):
"""Verifies if a dataset contains raster or vector data.
Args:
dataset (``osgeo.gdal.Dataset`` or ``osgeo.ogr.DataSource``): Dataset to verify.
Returns:
str: Either "unknown", "raster", or "vector".
"""
# Check the contents of an osgeo.gdal.Dataset
try:
if dataset.RasterCount > 0 and dataset.GetLayerCount() > 0:
return "unknown"
except AttributeError:
pass
try:
if dataset.RasterCount > 0:
return "raster"
except AttributeError:
pass
try:
if dataset.GetLayerCount() > 0:
return "vector"
else:
return "empty"
except AttributeError:
logging.error("%s is not an osgeo.gdal.Dataset object." % str(dataset))
return None