def perform_subset(self, src_ds, range_type, subset_rect, dst_rect, rangesubset=None): vrt = VRTBuilder(*subset_rect.size) input_bands = list(range_type) # list of band indices/names. defaults to all bands if rangesubset: subset_bands = rangesubset.get_band_indices(range_type, 1) else: subset_bands = xrange(1, len(range_type) + 1) for dst_index, src_index in enumerate(subset_bands, start=1): input_band = input_bands[src_index - 1] vrt.add_band(input_band.data_type) vrt.add_simple_source(dst_index, src_ds, src_index, subset_rect, dst_rect) vrt.copy_metadata(src_ds) vrt.copy_gcps(src_ds, subset_rect) return vrt.dataset
def get_source_dataset(self, coverage, data_items, range_type): if len(data_items) == 1: return gdal.OpenShared(abspath(connect(data_items[0]))) else: vrt = VRTBuilder(coverage.size_x, coverage.size_y, vrt_filename=temp_vsimem_filename()) # sort in ascending order according to semantic data_items = sorted(data_items, key=(lambda d: d.semantic)) gcps = [] compound_index = 0 for data_item in data_items: path = abspath(connect(data_item)) # iterate over all bands of the data item for set_index, item_index in self._data_item_band_indices( data_item): if set_index != compound_index + 1: raise ValueError compound_index = set_index band = range_type[set_index] vrt.add_band(band.data_type) vrt.add_simple_source(set_index, path, item_index) return vrt.dataset
def get_source_and_dest_rect(self, dataset, subsets): size_x, size_y = dataset.RasterXSize, dataset.RasterYSize image_rect = Rect(0, 0, size_x, size_y) if not subsets: subset_rect = image_rect # pixel subset elif subsets.srid is None: # means "imageCRS" minx, miny, maxx, maxy = subsets.xy_bbox minx = int(minx) if minx is not None else image_rect.offset_x miny = int(miny) if miny is not None else image_rect.offset_y maxx = int(maxx) if maxx is not None else image_rect.upper_x maxy = int(maxy) if maxy is not None else image_rect.upper_y subset_rect = Rect(minx, miny, maxx - minx + 1, maxy - miny + 1) # subset in geographical coordinates else: vrt = VRTBuilder(*image_rect.size) vrt.copy_gcps(dataset) options = reftools.suggest_transformer(dataset) subset_rect = reftools.rect_from_subset(vrt.dataset, subsets.srid, *subsets.xy_bbox, **options) # check whether or not the subsets intersect with the image if not image_rect.intersects(subset_rect): raise RenderException("Subset outside coverage extent.", "subset") src_rect = subset_rect #& image_rect # TODO: why no intersection?? dst_rect = src_rect - subset_rect.offset return src_rect, dst_rect