cars 1.0.0rc2__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cars might be problematic. Click here for more details.
- cars/__init__.py +86 -0
- cars/applications/__init__.py +40 -0
- cars/applications/application.py +117 -0
- cars/applications/application_constants.py +29 -0
- cars/applications/application_template.py +146 -0
- cars/applications/auxiliary_filling/__init__.py +29 -0
- cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +105 -0
- cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
- cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -0
- cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
- cars/applications/dem_generation/__init__.py +30 -0
- cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
- cars/applications/dem_generation/bulldozer_config/base_config.yaml +42 -0
- cars/applications/dem_generation/bulldozer_dem_app.py +641 -0
- cars/applications/dem_generation/bulldozer_memory.py +55 -0
- cars/applications/dem_generation/dem_generation_algo.py +107 -0
- cars/applications/dem_generation/dem_generation_constants.py +32 -0
- cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
- cars/applications/dense_match_filling/__init__.py +30 -0
- cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
- cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
- cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
- cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
- cars/applications/dense_match_filling/zero_padding_app.py +302 -0
- cars/applications/dense_matching/__init__.py +30 -0
- cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
- cars/applications/dense_matching/census_mccnn_sgm_app.py +1461 -0
- cars/applications/dense_matching/cpp/__init__.py +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.dll.a +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.pyd +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
- cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
- cars/applications/dense_matching/cpp/meson.build +9 -0
- cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
- cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
- cars/applications/dense_matching/dense_matching_algo.py +401 -0
- cars/applications/dense_matching/dense_matching_constants.py +89 -0
- cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
- cars/applications/dense_matching/disparity_grid_algo.py +597 -0
- cars/applications/dense_matching/loaders/__init__.py +23 -0
- cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
- cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
- cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
- cars/applications/dense_matching/loaders/config_mapping.json +13 -0
- cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
- cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
- cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
- cars/applications/dsm_filling/__init__.py +32 -0
- cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
- cars/applications/dsm_filling/border_interpolation_app.py +278 -0
- cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
- cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
- cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
- cars/applications/dsm_merging/__init__.py +28 -0
- cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
- cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
- cars/applications/grid_correction/__init__.py +30 -0
- cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
- cars/applications/grid_correction/grid_correction_app.py +557 -0
- cars/applications/grid_generation/__init__.py +30 -0
- cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
- cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
- cars/applications/grid_generation/grid_generation_algo.py +388 -0
- cars/applications/grid_generation/grid_generation_constants.py +46 -0
- cars/applications/grid_generation/transform_grid.py +88 -0
- cars/applications/ground_truth_reprojection/__init__.py +30 -0
- cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
- cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
- cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
- cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
- cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
- cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
- cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
- cars/applications/rasterization/__init__.py +30 -0
- cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
- cars/applications/rasterization/rasterization_algo.py +534 -0
- cars/applications/rasterization/rasterization_constants.py +38 -0
- cars/applications/rasterization/rasterization_wrappers.py +639 -0
- cars/applications/rasterization/simple_gaussian_app.py +1152 -0
- cars/applications/resampling/__init__.py +28 -0
- cars/applications/resampling/abstract_resampling_app.py +187 -0
- cars/applications/resampling/bicubic_resampling_app.py +760 -0
- cars/applications/resampling/resampling_algo.py +590 -0
- cars/applications/resampling/resampling_constants.py +36 -0
- cars/applications/resampling/resampling_wrappers.py +309 -0
- cars/applications/sensors_subsampling/__init__.py +32 -0
- cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
- cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
- cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
- cars/applications/sparse_matching/__init__.py +30 -0
- cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
- cars/applications/sparse_matching/sift_app.py +724 -0
- cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
- cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
- cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
- cars/applications/triangulation/__init__.py +32 -0
- cars/applications/triangulation/abstract_triangulation_app.py +227 -0
- cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
- cars/applications/triangulation/pc_transform.py +552 -0
- cars/applications/triangulation/triangulation_algo.py +371 -0
- cars/applications/triangulation/triangulation_constants.py +38 -0
- cars/applications/triangulation/triangulation_wrappers.py +259 -0
- cars/bundleadjustment.py +750 -0
- cars/cars.py +179 -0
- cars/conf/__init__.py +23 -0
- cars/conf/geoid/egm96.grd +0 -0
- cars/conf/geoid/egm96.grd.hdr +15 -0
- cars/conf/input_parameters.py +156 -0
- cars/conf/mask_cst.py +35 -0
- cars/core/__init__.py +23 -0
- cars/core/cars_logging.py +402 -0
- cars/core/constants.py +191 -0
- cars/core/constants_disparity.py +50 -0
- cars/core/datasets.py +140 -0
- cars/core/geometry/__init__.py +27 -0
- cars/core/geometry/abstract_geometry.py +1119 -0
- cars/core/geometry/shareloc_geometry.py +598 -0
- cars/core/inputs.py +568 -0
- cars/core/outputs.py +176 -0
- cars/core/preprocessing.py +722 -0
- cars/core/projection.py +843 -0
- cars/core/roi_tools.py +215 -0
- cars/core/tiling.py +774 -0
- cars/core/utils.py +164 -0
- cars/data_structures/__init__.py +23 -0
- cars/data_structures/cars_dataset.py +1544 -0
- cars/data_structures/cars_dict.py +74 -0
- cars/data_structures/corresponding_tiles_tools.py +186 -0
- cars/data_structures/dataframe_converter.py +185 -0
- cars/data_structures/format_transformation.py +297 -0
- cars/devibrate.py +689 -0
- cars/extractroi.py +264 -0
- cars/orchestrator/__init__.py +23 -0
- cars/orchestrator/achievement_tracker.py +125 -0
- cars/orchestrator/cluster/__init__.py +37 -0
- cars/orchestrator/cluster/abstract_cluster.py +250 -0
- cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
- cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
- cars/orchestrator/cluster/dask_config/README.md +94 -0
- cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
- cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
- cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
- cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
- cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
- cars/orchestrator/cluster/local_dask_cluster.py +116 -0
- cars/orchestrator/cluster/log_wrapper.py +728 -0
- cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
- cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
- cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
- cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
- cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
- cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
- cars/orchestrator/cluster/sequential_cluster.py +139 -0
- cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
- cars/orchestrator/memory_tools.py +47 -0
- cars/orchestrator/orchestrator.py +755 -0
- cars/orchestrator/orchestrator_constants.py +29 -0
- cars/orchestrator/registry/__init__.py +23 -0
- cars/orchestrator/registry/abstract_registry.py +143 -0
- cars/orchestrator/registry/compute_registry.py +106 -0
- cars/orchestrator/registry/id_generator.py +116 -0
- cars/orchestrator/registry/replacer_registry.py +213 -0
- cars/orchestrator/registry/saver_registry.py +363 -0
- cars/orchestrator/registry/unseen_registry.py +118 -0
- cars/orchestrator/tiles_profiler.py +279 -0
- cars/pipelines/__init__.py +26 -0
- cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
- cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
- cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
- cars/pipelines/default/__init__.py +26 -0
- cars/pipelines/default/default_pipeline.py +1088 -0
- cars/pipelines/filling/__init__.py +26 -0
- cars/pipelines/filling/filling.py +981 -0
- cars/pipelines/formatting/__init__.py +26 -0
- cars/pipelines/formatting/formatting.py +186 -0
- cars/pipelines/merging/__init__.py +26 -0
- cars/pipelines/merging/merging.py +439 -0
- cars/pipelines/parameters/__init__.py +0 -0
- cars/pipelines/parameters/advanced_parameters.py +256 -0
- cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
- cars/pipelines/parameters/application_parameters.py +72 -0
- cars/pipelines/parameters/depth_map_inputs.py +0 -0
- cars/pipelines/parameters/dsm_inputs.py +349 -0
- cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
- cars/pipelines/parameters/output_constants.py +52 -0
- cars/pipelines/parameters/output_parameters.py +438 -0
- cars/pipelines/parameters/sensor_inputs.py +859 -0
- cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
- cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
- cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
- cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
- cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
- cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
- cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
- cars/pipelines/pipeline.py +119 -0
- cars/pipelines/pipeline_constants.py +38 -0
- cars/pipelines/pipeline_template.py +135 -0
- cars/pipelines/subsampling/__init__.py +26 -0
- cars/pipelines/subsampling/subsampling.py +358 -0
- cars/pipelines/surface_modeling/__init__.py +26 -0
- cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
- cars/pipelines/tie_points/__init__.py +26 -0
- cars/pipelines/tie_points/tie_points.py +536 -0
- cars/starter.py +167 -0
- cars-1.0.0rc2.dist-info/DELVEWHEEL +2 -0
- cars-1.0.0rc2.dist-info/METADATA +289 -0
- cars-1.0.0rc2.dist-info/RECORD +225 -0
- cars-1.0.0rc2.dist-info/WHEEL +4 -0
- cars-1.0.0rc2.dist-info/entry_points.txt +8 -0
- cars.libs/libgcc_s_seh-1-b2494fcbd4d80cf2c98fdd5261f6d850.dll +0 -0
- cars.libs/libstdc++-6-e9b0d12ae0e9555bbae55e8dfd08c3f7.dll +0 -0
- cars.libs/libwinpthread-1-7882d1b093714ccdfaf4e0789a817792.dll +0 -0
cars/core/outputs.py
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# coding: utf8
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
|
|
5
|
+
#
|
|
6
|
+
# This file is part of CARS
|
|
7
|
+
# (see https://github.com/CNES/cars).
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
"""
|
|
22
|
+
Outputs module:
|
|
23
|
+
contains some CARS global shared general purpose output functions
|
|
24
|
+
"""
|
|
25
|
+
# Standard imports
|
|
26
|
+
from typing import Union
|
|
27
|
+
|
|
28
|
+
# Third party imports
|
|
29
|
+
import fiona
|
|
30
|
+
import numpy as np
|
|
31
|
+
import pandas
|
|
32
|
+
import rasterio as rio
|
|
33
|
+
import xarray as xr
|
|
34
|
+
from fiona.crs import from_epsg # pylint: disable=no-name-in-module
|
|
35
|
+
from rasterio.profiles import DefaultGTiffProfile
|
|
36
|
+
from shapely.geometry import mapping
|
|
37
|
+
|
|
38
|
+
# CARS imports
|
|
39
|
+
from cars.core import constants as cst
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def write_ply(path_ply_file: str, cloud: Union[xr.Dataset, pandas.DataFrame]):
|
|
43
|
+
"""
|
|
44
|
+
Write cloud to a ply file
|
|
45
|
+
|
|
46
|
+
:param path: path to the ply file to write
|
|
47
|
+
:param cloud: cloud to write,
|
|
48
|
+
it can be a xr.Dataset as the ones given in output of the triangulation
|
|
49
|
+
or a pandas.DataFrame as used in the rasterization
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
with open(path_ply_file, "w", encoding="utf-8") as ply_file:
|
|
53
|
+
if isinstance(cloud, xr.Dataset):
|
|
54
|
+
nb_points = int(
|
|
55
|
+
cloud[cst.POINT_CLOUD_CORR_MSK]
|
|
56
|
+
.where(cloud[cst.POINT_CLOUD_CORR_MSK].values != 0)
|
|
57
|
+
.count()
|
|
58
|
+
)
|
|
59
|
+
else:
|
|
60
|
+
nb_points = cloud.shape[0]
|
|
61
|
+
|
|
62
|
+
ply_file.write("ply\n")
|
|
63
|
+
ply_file.write("format ascii 1.0\n")
|
|
64
|
+
ply_file.write("element vertex {}\n".format(nb_points))
|
|
65
|
+
ply_file.write("property float x\n")
|
|
66
|
+
ply_file.write("property float y\n")
|
|
67
|
+
ply_file.write("property float z\n")
|
|
68
|
+
ply_file.write("end_header\n")
|
|
69
|
+
|
|
70
|
+
if isinstance(cloud, xr.Dataset):
|
|
71
|
+
for x_item, y_item, z_item, mask_item in zip( # noqa: B905
|
|
72
|
+
np.nditer(cloud[cst.X].values),
|
|
73
|
+
np.nditer(cloud[cst.Y].values),
|
|
74
|
+
np.nditer(cloud[cst.Z].values),
|
|
75
|
+
np.nditer(cloud[cst.POINT_CLOUD_CORR_MSK].values),
|
|
76
|
+
):
|
|
77
|
+
if mask_item != 0:
|
|
78
|
+
ply_file.write("{} {} {}\n".format(x_item, y_item, z_item))
|
|
79
|
+
else:
|
|
80
|
+
for xyz in cloud.itertuples():
|
|
81
|
+
ply_file.write(
|
|
82
|
+
"{} {} {}\n".format(
|
|
83
|
+
getattr(xyz, cst.X),
|
|
84
|
+
getattr(xyz, cst.Y),
|
|
85
|
+
getattr(xyz, cst.Z),
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def write_vector(polys, path_to_file, epsg, driver="GPKG"):
|
|
91
|
+
"""
|
|
92
|
+
Write list of polygons in a single vector file
|
|
93
|
+
|
|
94
|
+
:param polys: list of polygons to write in the file
|
|
95
|
+
:param path_to_file: file to create
|
|
96
|
+
:param epsg: EPSG code of the polygons
|
|
97
|
+
:param driver: vector file type (default format is geopackage)
|
|
98
|
+
"""
|
|
99
|
+
crs = from_epsg(epsg) # pylint: disable=c-extension-no-member
|
|
100
|
+
sch = {"geometry": "Polygon", "properties": {"Type": "str:10"}}
|
|
101
|
+
|
|
102
|
+
with fiona.open(
|
|
103
|
+
path_to_file, "w", crs=crs, driver=driver, schema=sch
|
|
104
|
+
) as vector_file:
|
|
105
|
+
for poly in polys:
|
|
106
|
+
poly_dict = {
|
|
107
|
+
"geometry": mapping(poly),
|
|
108
|
+
"properties": {"Type": "Polygon"},
|
|
109
|
+
}
|
|
110
|
+
vector_file.write(poly_dict)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def rasterio_write_georaster( # pylint: disable=too-many-positional-arguments
|
|
114
|
+
raster_file: str,
|
|
115
|
+
data: np.ndarray,
|
|
116
|
+
profile: dict = None,
|
|
117
|
+
window: rio.windows.Window = None,
|
|
118
|
+
descriptor=None,
|
|
119
|
+
bands_description=None,
|
|
120
|
+
classes_info_tag=None,
|
|
121
|
+
):
|
|
122
|
+
"""
|
|
123
|
+
Write a raster file from array
|
|
124
|
+
|
|
125
|
+
:param raster_file: Image file
|
|
126
|
+
:param data: image data
|
|
127
|
+
:param profile: rasterio profile
|
|
128
|
+
:param window: window to write in
|
|
129
|
+
:param descriptor: rasterio descriptor
|
|
130
|
+
:param bands_description: description of bands
|
|
131
|
+
:param classes_info_tag: tag to add to descriptor
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
def write_data(data, window=None, descriptor=None):
|
|
135
|
+
"""
|
|
136
|
+
Write data through descriptor
|
|
137
|
+
:param data: data to write on disk
|
|
138
|
+
:param window: window
|
|
139
|
+
:param descriptor: descriptor
|
|
140
|
+
:return:
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
if len(data.shape) == 2:
|
|
144
|
+
descriptor.write(data, 1, window=window)
|
|
145
|
+
else:
|
|
146
|
+
descriptor.write(data, window=window)
|
|
147
|
+
|
|
148
|
+
if descriptor is not None:
|
|
149
|
+
# write tag
|
|
150
|
+
if classes_info_tag is not None:
|
|
151
|
+
descriptor.update_tags(CLASSES=classes_info_tag)
|
|
152
|
+
|
|
153
|
+
# write data
|
|
154
|
+
if bands_description is not None:
|
|
155
|
+
for idx, description in enumerate(bands_description):
|
|
156
|
+
# Band indexing starts at 1
|
|
157
|
+
descriptor.set_band_description(idx + 1, str(description))
|
|
158
|
+
descriptor.write_band(idx + 1, data[idx, :, :], window=window)
|
|
159
|
+
else:
|
|
160
|
+
write_data(data, window=window, descriptor=descriptor)
|
|
161
|
+
|
|
162
|
+
else:
|
|
163
|
+
count = 1
|
|
164
|
+
width, height = data.shape[0], data.shape[1]
|
|
165
|
+
if len(data.shape) > 2:
|
|
166
|
+
count = data.shape[0]
|
|
167
|
+
width, height = data.shape[1], data.shape[2]
|
|
168
|
+
|
|
169
|
+
if profile is None:
|
|
170
|
+
profile = DefaultGTiffProfile(count=count)
|
|
171
|
+
profile["height"] = height
|
|
172
|
+
profile["width"] = width
|
|
173
|
+
profile["dtype"] = "float32"
|
|
174
|
+
|
|
175
|
+
with rio.open(raster_file, "w", **profile) as new_descriptor:
|
|
176
|
+
write_data(data, window=window, descriptor=new_descriptor)
|