def compare_proj(proj1: CRS, proj2: CRS) -> bool: """ Compare two projections to see if they are the same, using pyproj.CRS.is_exact_same. :param proj1: The first projection to compare. :param proj2: The first projection to compare. :returns: True if the two projections are the same. """ assert all( [isinstance(proj1, (pyproj.CRS, CRS)), isinstance(proj2, (pyproj.CRS, CRS))] ), "proj1 and proj2 must be rasterio.crs.CRS objects." proj1 = pyproj.CRS(proj1.to_string()) proj2 = pyproj.CRS(proj2.to_string()) same: bool = proj1.is_exact_same(proj2) return same
def metadata(sceneid, pmin=2, pmax=98, **kwargs): """ Retrieve image bounds and band statistics. Attributes ---------- sceneid : str Sentinel-2 sceneid. pmin : int, optional, (default: 2) Histogram minimum cut. pmax : int, optional, (default: 98) Histogram maximum cut. kwargs : optional These are passed to 'rio_tiler.sentinel2._sentinel_stats' e.g: histogram_bins=20' Returns ------- out : dict Dictionary with image bounds and bands statistics. """ scene_params = _sentinel_parse_scene_id(sceneid) path_prefix = os.path.join(scene_params["aws_bucket"], scene_params["aws_prefix"]) preview_file = os.path.join(path_prefix, scene_params["preview_file"]) dst_crs = CRS({"init": "EPSG:4326"}) with rasterio.open(preview_file) as src: bounds = transform_bounds(*[src.crs, dst_crs] + list(src.bounds), densify_pts=21) info = {"sceneid": sceneid} info["bounds"] = {"value": bounds, "crs": dst_crs.to_string()} addresses = [ "{}/{}/B{}.jp2".format(path_prefix, scene_params["preview_prefix"], band) for band in scene_params["bands"] ] _stats_worker = partial(_sentinel_stats, percentiles=(pmin, pmax), **kwargs) with futures.ThreadPoolExecutor(max_workers=MAX_THREADS) as executor: responses = executor.map(_stats_worker, addresses) info["statistics"] = { b: v for b, d in zip(scene_params["bands"], responses) for k, v in d.items() } return info
def metadata(sceneid, pmin=2, pmax=98): """ Retrieve image bounds and band statistics. Attributes ---------- sceneid : str Sentinel-2 sceneid. pmin : int, optional, (default: 2) Histogram minimum cut. pmax : int, optional, (default: 98) Histogram maximum cut. Returns ------- out : dict Dictionary with image bounds and bands statistics. """ scene_params = _sentinel_parse_scene_id(sceneid) sentinel_address = "{}/{}".format(SENTINEL_BUCKET, scene_params["key"]) dst_crs = CRS({"init": "EPSG:4326"}) with rasterio.open("{}/preview.jp2".format(sentinel_address)) as src: bounds = transform_bounds( *[src.crs, dst_crs] + list(src.bounds), densify_pts=21 ) info = {"sceneid": sceneid} info["bounds"] = {"value": bounds, "crs": dst_crs.to_string()} addresses = [ "{}/preview/B{}.jp2".format(sentinel_address, band) for band in SENTINEL_BANDS ] _stats_worker = partial(_sentinel_stats, percentiles=(pmin, pmax)) with futures.ThreadPoolExecutor(max_workers=MAX_THREADS) as executor: responses = executor.map(_stats_worker, addresses) info["statistics"] = { b: v for b, d in zip(SENTINEL_BANDS, responses) for k, v in d.items() } return info