|
7 | 7 |
|
8 | 8 | import pystac
|
9 | 9 | import pystac_client
|
10 |
| -import rasterio |
11 | 10 | from planetary_computer import sign_inplace
|
12 | 11 | from pystac_client.exceptions import APIError
|
13 | 12 |
|
14 | 13 | from geospatial_tools import geotools_types
|
15 |
| -from geospatial_tools.raster import get_total_band_count, reproject_raster |
| 14 | +from geospatial_tools.raster import ( |
| 15 | + create_merged_raster_bands_metadata, |
| 16 | + get_total_band_count, |
| 17 | + merge_raster_bands, |
| 18 | + reproject_raster, |
| 19 | +) |
16 | 20 | from geospatial_tools.utils import create_logger, download_url
|
17 | 21 |
|
18 | 22 | LOGGER = create_logger(__name__)
|
@@ -112,33 +116,14 @@ def merge_asset(self, base_directory: Optional[Union[str, pathlib.Path]] = None,
|
112 | 116 |
|
113 | 117 | merged_filename = base_directory / f"{self.asset_id}_merged.tif"
|
114 | 118 |
|
115 |
| - total_band_count = self._get_asset_total_bands() |
116 |
| - |
117 |
| - self.logger.info(total_band_count) |
118 |
| - |
119 |
| - meta = self._create_merged_asset_metadata(total_band_count) |
120 |
| - |
121 |
| - merged_image_index = 1 |
122 |
| - band_index = 0 |
123 |
| - self.logger.info(f"Merging asset [{self.asset_id}] ...") |
124 |
| - with rasterio.open(merged_filename, "w", **meta) as merged_asset_image: |
125 |
| - for asset_sub_item in self.list: |
126 |
| - self.logger.info(f"Writing band image: {asset_sub_item.item_id}") |
127 |
| - with rasterio.open(asset_sub_item.filename) as asset_band_image: |
128 |
| - num_of_bands = asset_band_image.count |
129 |
| - for asset_band_image_index in range(1, num_of_bands + 1): |
130 |
| - self.logger.info(f"writing asset sub item band {asset_band_image_index}") |
131 |
| - self.logger.info(f"writing merged index band {merged_image_index}") |
132 |
| - merged_asset_image.write_band(merged_image_index, asset_band_image.read(asset_band_image_index)) |
133 |
| - description = self.bands[band_index] |
134 |
| - if num_of_bands > 1: |
135 |
| - description = f"{description}-{asset_band_image_index}" |
136 |
| - merged_asset_image.set_band_description(merged_image_index, description) |
137 |
| - merged_asset_image.update_tags( |
138 |
| - merged_image_index, **asset_band_image.tags(asset_band_image_index) |
139 |
| - ) |
140 |
| - merged_image_index += 1 |
141 |
| - band_index += 1 |
| 119 | + asset_filename_list = [asset.filename for asset in self.list] |
| 120 | + |
| 121 | + meta = self._create_merged_asset_metadata() |
| 122 | + |
| 123 | + merge_raster_bands( |
| 124 | + merged_filename=merged_filename, raster_file_list=asset_filename_list, metadata=meta, band_names=self.bands |
| 125 | + ) |
| 126 | + |
142 | 127 | if merged_filename.exists():
|
143 | 128 | self.logger.info(f"Asset [{self.asset_id}] merged successfully")
|
144 | 129 | self.logger.info(f"Asset location : [{merged_filename}]")
|
@@ -189,11 +174,10 @@ def delete_reprojected_asset(self):
|
189 | 174 | self.logger.info(f"Deleting reprojected asset file for [{self.reprojected_asset_path}]")
|
190 | 175 | self.reprojected_asset_path.unlink()
|
191 | 176 |
|
192 |
| - def _create_merged_asset_metadata(self, total_band_count): |
| 177 | + def _create_merged_asset_metadata(self): |
193 | 178 | self.logger.info("Creating merged asset metadata")
|
194 |
| - with rasterio.open(self.list[0].filename) as meta_source: |
195 |
| - meta = meta_source.meta |
196 |
| - meta.update(count=total_band_count) |
| 179 | + file_list = [asset.filename for asset in self.list] |
| 180 | + meta = create_merged_raster_bands_metadata(file_list) |
197 | 181 | return meta
|
198 | 182 |
|
199 | 183 | def _get_asset_total_bands(self):
|
|
0 commit comments