def vectorize(self, index_feature): # target path name = index_feature[str('name')] path = os.path.join(self.target_path, name[:3], '{}'.format(name)) if os.path.exists(path): return # create directory try: os.makedirs(os.path.dirname(path)) except OSError: pass # no problem index_geometry = index_feature.geometry() geo_transform = self.geo_transform.shifted(index_geometry) # data with one pixel margin on all sides indices = self.geo_transform.get_indices(index_geometry) indices = (indices[0] - 1, indices[1] - 1, indices[2] + 1, indices[3] + 1) direction = self.direction_group.read(indices) accumulation = self.accumulation_group.read(indices) # processing data_source = SHAPE.CreateDataSource(str(path)) layer_sr = osr.SpatialReference(self.projection) layer_name = str(os.path.basename(path)) layer = data_source.CreateLayer(layer_name, layer_sr) layer.CreateField(ogr.FieldDefn(str('class'), ogr.OFTReal)) layer_defn = layer.GetLayerDefn() generator = vectorize(direction=direction, accumulation=accumulation) for klass, indices in generator: feature = ogr.Feature(layer_defn) points = geo_transform.get_coordinates(indices) feature[str('class')] = klass geometry = ogr.Geometry(ogr.wkbLineString) for p in zip(*points): geometry.AddPoint_2D(*p) feature.SetGeometry(geometry) layer.CreateFeature(feature)
def get_mask(self, geometry, shape): # create an ogr datasource driver = ogr.GetDriverByName(str('Memory')) source = driver.CreateDataSource(str('')) sr = osr.SpatialReference(self.projection) layer = source.CreateLayer(str(''), sr) defn = layer.GetLayerDefn() feature = ogr.Feature(defn) feature.SetGeometry(geometry) layer.CreateFeature(feature) # burn where data should be mask = np.zeros(shape, dtype='u1') geo_transform = self.geo_transform.shifted(geometry) kwargs = { 'geo_transform': geo_transform, 'projection': self.projection } with datasets.Dataset(mask, **kwargs) as dataset: gdal.RasterizeLayer(dataset, (1, ), layer, burn_values=(1, )) return mask.astype('b1').repeat(3, axis=0)
import os import shlex import subprocess import numpy as np from raster_tools import datasets from raster_tools import gdal from raster_tools import ogr from raster_tools import osr from raster_tools import vectors PROJECTION = osr.GetUserInputAsWKT(str('epsg:28992')) MEM_DRIVER = ogr.GetDriverByName(str('Memory')) NO_DATA_VALUE = np.finfo('f4').min.item() SR = osr.SpatialReference(PROJECTION) def clip(kwargs, geometry): """ Clip kwargs in place. """ # do not touch original kwargs kwargs = kwargs.copy() array = kwargs.pop('array') mask = np.ones_like(array, 'u1') # create an ogr datasource source = MEM_DRIVER.CreateDataSource('') layer = source.CreateLayer(str(''), SR) defn = layer.GetLayerDefn() feature = ogr.Feature(defn) feature.SetGeometry(geometry)
import numpy as np from raster_tools import gdal from raster_tools import ogr from raster_tools import osr from raster_tools import datasets from raster_tools import datasources DRIVER_OGR_MEMORY = ogr.GetDriverByName(str('Memory')) DRIVER_GDAL_MEM = gdal.GetDriverByName(str('mem')) DRIVER_GDAL_GTIFF = gdal.GetDriverByName(str('gtiff')) WKT_RD = osr.GetUserInputAsWKT(str('epsg:28992')) PROJ4_RD = osr.SpatialReference(WKT_RD).ExportToProj4().strip() def command(gardens_path, aerial_image_path, target_path, min_green, max_green, check_rast, part, pk): # open input shapefile shape_gardens = ogr.Open(gardens_path) layer_gardens = shape_gardens[0] # check projection of input shapefile sr = layer_gardens.GetSpatialRef() check_sr = get_projection(sr) if check_sr is None: print('[!] ERROR : EPSG projection code missing from shape.') hint = '[*] INFO : Use this command: gdalsrsinfo -o wkt EPSG:28992 > ' print(hint, gardens_path.replace('.shp', '.prj'))
def sr(self): return osr.SpatialReference(self.projection)