cars 1.0.0rc3__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.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.
Files changed (220) hide show
  1. cars/__init__.py +74 -0
  2. cars/applications/__init__.py +40 -0
  3. cars/applications/application.py +117 -0
  4. cars/applications/application_constants.py +29 -0
  5. cars/applications/application_template.py +146 -0
  6. cars/applications/auxiliary_filling/__init__.py +29 -0
  7. cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +105 -0
  8. cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
  9. cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -0
  10. cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
  11. cars/applications/dem_generation/__init__.py +30 -0
  12. cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
  13. cars/applications/dem_generation/bulldozer_config/base_config.yaml +46 -0
  14. cars/applications/dem_generation/bulldozer_dem_app.py +641 -0
  15. cars/applications/dem_generation/bulldozer_memory.py +55 -0
  16. cars/applications/dem_generation/dem_generation_algo.py +107 -0
  17. cars/applications/dem_generation/dem_generation_constants.py +32 -0
  18. cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
  19. cars/applications/dense_match_filling/__init__.py +30 -0
  20. cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
  21. cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
  22. cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
  23. cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
  24. cars/applications/dense_match_filling/zero_padding_app.py +302 -0
  25. cars/applications/dense_matching/__init__.py +30 -0
  26. cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
  27. cars/applications/dense_matching/census_mccnn_sgm_app.py +1461 -0
  28. cars/applications/dense_matching/cpp/__init__.py +0 -0
  29. cars/applications/dense_matching/cpp/dense_matching_cpp.cpython-313-x86_64-linux-gnu.so +0 -0
  30. cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
  31. cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
  32. cars/applications/dense_matching/cpp/meson.build +9 -0
  33. cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
  34. cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
  35. cars/applications/dense_matching/dense_matching_algo.py +401 -0
  36. cars/applications/dense_matching/dense_matching_constants.py +89 -0
  37. cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
  38. cars/applications/dense_matching/disparity_grid_algo.py +597 -0
  39. cars/applications/dense_matching/loaders/__init__.py +23 -0
  40. cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
  41. cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
  42. cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
  43. cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
  44. cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
  45. cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
  46. cars/applications/dense_matching/loaders/config_mapping.json +13 -0
  47. cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
  48. cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
  49. cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
  50. cars/applications/dsm_filling/__init__.py +32 -0
  51. cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
  52. cars/applications/dsm_filling/border_interpolation_app.py +278 -0
  53. cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
  54. cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
  55. cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
  56. cars/applications/dsm_merging/__init__.py +28 -0
  57. cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
  58. cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
  59. cars/applications/grid_correction/__init__.py +30 -0
  60. cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
  61. cars/applications/grid_correction/grid_correction_app.py +557 -0
  62. cars/applications/grid_generation/__init__.py +30 -0
  63. cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
  64. cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
  65. cars/applications/grid_generation/grid_generation_algo.py +388 -0
  66. cars/applications/grid_generation/grid_generation_constants.py +46 -0
  67. cars/applications/grid_generation/transform_grid.py +88 -0
  68. cars/applications/ground_truth_reprojection/__init__.py +30 -0
  69. cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
  70. cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
  71. cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
  72. cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
  73. cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
  74. cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
  75. cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
  76. cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
  77. cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
  78. cars/applications/rasterization/__init__.py +30 -0
  79. cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
  80. cars/applications/rasterization/rasterization_algo.py +534 -0
  81. cars/applications/rasterization/rasterization_constants.py +38 -0
  82. cars/applications/rasterization/rasterization_wrappers.py +639 -0
  83. cars/applications/rasterization/simple_gaussian_app.py +1152 -0
  84. cars/applications/resampling/__init__.py +28 -0
  85. cars/applications/resampling/abstract_resampling_app.py +187 -0
  86. cars/applications/resampling/bicubic_resampling_app.py +760 -0
  87. cars/applications/resampling/resampling_algo.py +590 -0
  88. cars/applications/resampling/resampling_constants.py +36 -0
  89. cars/applications/resampling/resampling_wrappers.py +309 -0
  90. cars/applications/sensors_subsampling/__init__.py +32 -0
  91. cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
  92. cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
  93. cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
  94. cars/applications/sparse_matching/__init__.py +30 -0
  95. cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
  96. cars/applications/sparse_matching/sift_app.py +724 -0
  97. cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
  98. cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
  99. cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
  100. cars/applications/triangulation/__init__.py +32 -0
  101. cars/applications/triangulation/abstract_triangulation_app.py +227 -0
  102. cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
  103. cars/applications/triangulation/pc_transform.py +552 -0
  104. cars/applications/triangulation/triangulation_algo.py +371 -0
  105. cars/applications/triangulation/triangulation_constants.py +38 -0
  106. cars/applications/triangulation/triangulation_wrappers.py +259 -0
  107. cars/bundleadjustment.py +750 -0
  108. cars/cars.py +179 -0
  109. cars/conf/__init__.py +23 -0
  110. cars/conf/geoid/egm96.grd +0 -0
  111. cars/conf/geoid/egm96.grd.hdr +15 -0
  112. cars/conf/input_parameters.py +156 -0
  113. cars/conf/mask_cst.py +35 -0
  114. cars/core/__init__.py +23 -0
  115. cars/core/cars_logging.py +402 -0
  116. cars/core/constants.py +191 -0
  117. cars/core/constants_disparity.py +50 -0
  118. cars/core/datasets.py +140 -0
  119. cars/core/geometry/__init__.py +27 -0
  120. cars/core/geometry/abstract_geometry.py +1130 -0
  121. cars/core/geometry/shareloc_geometry.py +604 -0
  122. cars/core/inputs.py +568 -0
  123. cars/core/outputs.py +176 -0
  124. cars/core/preprocessing.py +722 -0
  125. cars/core/projection.py +843 -0
  126. cars/core/roi_tools.py +215 -0
  127. cars/core/tiling.py +774 -0
  128. cars/core/utils.py +164 -0
  129. cars/data_structures/__init__.py +23 -0
  130. cars/data_structures/cars_dataset.py +1544 -0
  131. cars/data_structures/cars_dict.py +74 -0
  132. cars/data_structures/corresponding_tiles_tools.py +186 -0
  133. cars/data_structures/dataframe_converter.py +185 -0
  134. cars/data_structures/format_transformation.py +297 -0
  135. cars/devibrate.py +689 -0
  136. cars/extractroi.py +264 -0
  137. cars/orchestrator/__init__.py +23 -0
  138. cars/orchestrator/achievement_tracker.py +125 -0
  139. cars/orchestrator/cluster/__init__.py +37 -0
  140. cars/orchestrator/cluster/abstract_cluster.py +250 -0
  141. cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
  142. cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
  143. cars/orchestrator/cluster/dask_config/README.md +94 -0
  144. cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
  145. cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
  146. cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
  147. cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
  148. cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
  149. cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
  150. cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
  151. cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
  152. cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
  153. cars/orchestrator/cluster/local_dask_cluster.py +116 -0
  154. cars/orchestrator/cluster/log_wrapper.py +728 -0
  155. cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
  156. cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
  157. cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
  158. cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
  159. cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
  160. cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
  161. cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
  162. cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
  163. cars/orchestrator/cluster/sequential_cluster.py +139 -0
  164. cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
  165. cars/orchestrator/memory_tools.py +47 -0
  166. cars/orchestrator/orchestrator.py +755 -0
  167. cars/orchestrator/orchestrator_constants.py +29 -0
  168. cars/orchestrator/registry/__init__.py +23 -0
  169. cars/orchestrator/registry/abstract_registry.py +143 -0
  170. cars/orchestrator/registry/compute_registry.py +106 -0
  171. cars/orchestrator/registry/id_generator.py +116 -0
  172. cars/orchestrator/registry/replacer_registry.py +213 -0
  173. cars/orchestrator/registry/saver_registry.py +363 -0
  174. cars/orchestrator/registry/unseen_registry.py +118 -0
  175. cars/orchestrator/tiles_profiler.py +279 -0
  176. cars/pipelines/__init__.py +26 -0
  177. cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
  178. cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
  179. cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
  180. cars/pipelines/default/__init__.py +26 -0
  181. cars/pipelines/default/default_pipeline.py +1095 -0
  182. cars/pipelines/filling/__init__.py +26 -0
  183. cars/pipelines/filling/filling.py +981 -0
  184. cars/pipelines/formatting/__init__.py +26 -0
  185. cars/pipelines/formatting/formatting.py +190 -0
  186. cars/pipelines/merging/__init__.py +26 -0
  187. cars/pipelines/merging/merging.py +439 -0
  188. cars/pipelines/parameters/__init__.py +0 -0
  189. cars/pipelines/parameters/advanced_parameters.py +256 -0
  190. cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
  191. cars/pipelines/parameters/application_parameters.py +72 -0
  192. cars/pipelines/parameters/depth_map_inputs.py +0 -0
  193. cars/pipelines/parameters/dsm_inputs.py +349 -0
  194. cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
  195. cars/pipelines/parameters/output_constants.py +52 -0
  196. cars/pipelines/parameters/output_parameters.py +435 -0
  197. cars/pipelines/parameters/sensor_inputs.py +859 -0
  198. cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
  199. cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
  200. cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
  201. cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
  202. cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
  203. cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
  204. cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
  205. cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
  206. cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
  207. cars/pipelines/pipeline.py +119 -0
  208. cars/pipelines/pipeline_constants.py +38 -0
  209. cars/pipelines/pipeline_template.py +135 -0
  210. cars/pipelines/subsampling/__init__.py +26 -0
  211. cars/pipelines/subsampling/subsampling.py +358 -0
  212. cars/pipelines/surface_modeling/__init__.py +26 -0
  213. cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
  214. cars/pipelines/tie_points/__init__.py +26 -0
  215. cars/pipelines/tie_points/tie_points.py +536 -0
  216. cars/starter.py +167 -0
  217. cars-1.0.0rc3.dist-info/METADATA +289 -0
  218. cars-1.0.0rc3.dist-info/RECORD +220 -0
  219. cars-1.0.0rc3.dist-info/WHEEL +6 -0
  220. cars-1.0.0rc3.dist-info/entry_points.txt +8 -0
@@ -0,0 +1,349 @@
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
+ # pylint: disable=too-many-lines
21
+ """
22
+ CARS dsm inputs
23
+ """
24
+
25
+ import logging
26
+
27
+ import numpy as np
28
+ from json_checker import Checker, Or
29
+
30
+ # CARS imports
31
+ import cars.pipelines.parameters.dsm_inputs_constants as dsm_cst
32
+ from cars.core import constants as cst
33
+ from cars.core import inputs
34
+ from cars.core.geometry.abstract_geometry import AbstractGeometry
35
+ from cars.core.utils import make_relative_path_absolute
36
+ from cars.pipelines.parameters import sensor_inputs as sens_inp
37
+ from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
38
+
39
+
40
+ def check_dsm_inputs(conf, config_dir=None):
41
+ """
42
+ Check the inputs given
43
+
44
+ :param conf: configuration of inputs
45
+ :type conf: dict
46
+ :param config_dir: directory of used json/yaml, if
47
+ user filled paths with relative paths
48
+ :type config_dir: str
49
+
50
+ :return: overloader inputs
51
+ :rtype: dict
52
+ """
53
+
54
+ overloaded_conf = {}
55
+
56
+ # Overload some optional parameters
57
+ overloaded_conf[dsm_cst.DSMS] = {}
58
+
59
+ overloaded_conf[sens_cst.ROI] = conf.get(sens_cst.ROI, None)
60
+
61
+ overloaded_conf[sens_cst.INITIAL_ELEVATION] = (
62
+ sens_inp.get_initial_elevation(
63
+ conf.get(sens_cst.INITIAL_ELEVATION, None)
64
+ )
65
+ )
66
+
67
+ overloaded_conf[sens_cst.SENSORS] = conf.get(sens_cst.SENSORS, None)
68
+
69
+ overloaded_conf[sens_cst.PAIRING] = conf.get(sens_cst.PAIRING, None)
70
+
71
+ # Validate inputs
72
+ inputs_schema = {
73
+ dsm_cst.DSMS: dict,
74
+ sens_cst.ROI: Or(str, dict, None),
75
+ sens_cst.INITIAL_ELEVATION: Or(dict, None),
76
+ sens_cst.SENSORS: Or(dict, None),
77
+ sens_cst.PAIRING: Or([[str]], None),
78
+ }
79
+
80
+ checker_inputs = Checker(inputs_schema)
81
+ checker_inputs.validate(overloaded_conf)
82
+
83
+ # Validate depth maps
84
+
85
+ dsm_schema = {
86
+ cst.DSM_CLASSIF: Or(str, None),
87
+ cst.DSM_ALT: Or(str, None),
88
+ cst.DSM_ALT_INF: Or(str, None),
89
+ cst.DSM_ALT_SUP: Or(str, None),
90
+ cst.DSM_WEIGHTS_SUM: Or(str, None),
91
+ cst.DSM_MSK: Or(str, None),
92
+ cst.DSM_NB_PTS: Or(str, None),
93
+ cst.DSM_NB_PTS_IN_CELL: Or(str, None),
94
+ cst.DSM_MEAN: Or(str, None),
95
+ cst.DSM_STD_DEV: Or(str, None),
96
+ cst.DSM_INF_MEAN: Or(str, None),
97
+ cst.DSM_INF_STD: Or(str, None),
98
+ cst.DSM_SUP_MEAN: Or(str, None),
99
+ cst.DSM_SUP_STD: Or(str, None),
100
+ cst.DSM_AMBIGUITY: Or(str, None),
101
+ cst.DSM_PERFORMANCE_MAP: Or(str, None),
102
+ cst.DSM_SOURCE_PC: Or(str, None),
103
+ cst.DSM_FILLING: Or(str, None),
104
+ cst.DSM_COLOR: Or(str, None),
105
+ }
106
+
107
+ checker_pc = Checker(dsm_schema)
108
+ for dsm_key in conf[dsm_cst.DSMS]:
109
+ # Get depth maps with default
110
+ overloaded_conf[dsm_cst.DSMS][dsm_key] = {}
111
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_ALT] = conf[
112
+ dsm_cst.DSMS
113
+ ][dsm_key].get("dsm", None)
114
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_CLASSIF] = conf[
115
+ dsm_cst.DSMS
116
+ ][dsm_key].get("merging_classification", None)
117
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_COLOR] = conf[
118
+ dsm_cst.DSMS
119
+ ][dsm_key].get("image", None)
120
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_MSK] = conf[
121
+ dsm_cst.DSMS
122
+ ][dsm_key].get("mask", None)
123
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_ALT_INF] = conf[
124
+ dsm_cst.DSMS
125
+ ][dsm_key].get("dsm_inf", None)
126
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_ALT_SUP] = conf[
127
+ dsm_cst.DSMS
128
+ ][dsm_key].get("dsm_sup", None)
129
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_WEIGHTS_SUM] = conf[
130
+ dsm_cst.DSMS
131
+ ][dsm_key].get("weights", None)
132
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_NB_PTS] = conf[
133
+ dsm_cst.DSMS
134
+ ][dsm_key].get("dsm_n_pts", None)
135
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_NB_PTS_IN_CELL] = conf[
136
+ dsm_cst.DSMS
137
+ ][dsm_key].get("dsm_pts_in_cell", None)
138
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_MEAN] = conf[
139
+ dsm_cst.DSMS
140
+ ][dsm_key].get("dsm_mean", None)
141
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_STD_DEV] = conf[
142
+ dsm_cst.DSMS
143
+ ][dsm_key].get("dsm_std", None)
144
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_INF_MEAN] = conf[
145
+ dsm_cst.DSMS
146
+ ][dsm_key].get("dsm_inf_mean", None)
147
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_INF_STD] = conf[
148
+ dsm_cst.DSMS
149
+ ][dsm_key].get("dsm_inf_std", None)
150
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_SUP_MEAN] = conf[
151
+ dsm_cst.DSMS
152
+ ][dsm_key].get("dsm_sup_mean", None)
153
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_SUP_STD] = conf[
154
+ dsm_cst.DSMS
155
+ ][dsm_key].get("dsm_sup_std", None)
156
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_AMBIGUITY] = conf[
157
+ dsm_cst.DSMS
158
+ ][dsm_key].get("ambiguity", None)
159
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_PERFORMANCE_MAP] = conf[
160
+ dsm_cst.DSMS
161
+ ][dsm_key].get("performance_map", None)
162
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_SOURCE_PC] = conf[
163
+ dsm_cst.DSMS
164
+ ][dsm_key].get("contributing_pair", None)
165
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_FILLING] = conf[
166
+ dsm_cst.DSMS
167
+ ][dsm_key].get("merging_filling", None)
168
+
169
+ # validate
170
+ checker_pc.validate(overloaded_conf[dsm_cst.DSMS][dsm_key])
171
+
172
+ # Modify to absolute path
173
+ if config_dir is not None:
174
+ modify_to_absolute_path(config_dir, overloaded_conf)
175
+ else:
176
+ logging.debug(
177
+ "path of config file was not given,"
178
+ "relative path are not transformed to absolute paths"
179
+ )
180
+
181
+ for dsm_key in conf[dsm_cst.DSMS]:
182
+ # check sizes
183
+ check_input_size(
184
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.INDEX_DSM_ALT],
185
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.DSM_CLASSIF],
186
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.INDEX_DSM_COLOR],
187
+ overloaded_conf[dsm_cst.DSMS][dsm_key][cst.INDEX_DSM_MASK],
188
+ )
189
+
190
+ # Check srtm dir
191
+ sens_inp.check_srtm(
192
+ overloaded_conf[sens_cst.INITIAL_ELEVATION][sens_cst.DEM_PATH]
193
+ )
194
+
195
+ check_phasing(conf[dsm_cst.DSMS])
196
+
197
+ overloaded_conf[sens_cst.LOADERS] = sens_inp.check_loaders(
198
+ conf.get(sens_cst.LOADERS, {})
199
+ )
200
+
201
+ classif_loader = overloaded_conf[sens_cst.LOADERS][
202
+ sens_cst.INPUT_CLASSIFICATION
203
+ ]
204
+
205
+ overloaded_conf[sens_cst.FILLING] = sens_inp.check_filling(
206
+ conf.get(sens_cst.FILLING, {}), classif_loader
207
+ )
208
+
209
+ if sens_cst.SENSORS in conf and conf[sens_cst.SENSORS] is not None:
210
+ sens_inp.check_sensors(conf, overloaded_conf, config_dir)
211
+
212
+ return overloaded_conf
213
+
214
+
215
+ def check_geometry_plugin(conf_inputs, conf_geom_plugin):
216
+ """
217
+ Check the geometry plugin with inputs
218
+ :param conf_geom_plugin: name of geometry plugin
219
+ :type conf_geom_plugin: str
220
+ :param conf_inputs: checked configuration of inputs
221
+ :type conf_inputs: type
222
+
223
+ :return: geometry plugin with dem
224
+ """
225
+ if conf_geom_plugin is None:
226
+ conf_geom_plugin = "SharelocGeometry"
227
+
228
+ dem_path = conf_inputs[sens_cst.INITIAL_ELEVATION][sens_cst.DEM_PATH]
229
+
230
+ if dem_path is None:
231
+ return conf_geom_plugin, None
232
+
233
+ # Initialize a geometry plugin with elevation information
234
+ geom_plugin_with_dem_and_geoid = (
235
+ AbstractGeometry( # pylint: disable=abstract-class-instantiated
236
+ conf_geom_plugin,
237
+ dem=dem_path,
238
+ geoid=conf_inputs[sens_cst.INITIAL_ELEVATION][sens_cst.GEOID],
239
+ default_alt=sens_cst.CARS_DEFAULT_ALT,
240
+ )
241
+ )
242
+
243
+ return conf_geom_plugin, geom_plugin_with_dem_and_geoid
244
+
245
+
246
+ def check_input_size(dsm, classif, color, mask):
247
+ """
248
+ Check dsm, mask, color, classif given
249
+
250
+ Images must have same size
251
+
252
+ :param dsm: phased dsm path
253
+ :type dsm: str
254
+ :param classif: classif path
255
+ :type classif: str
256
+ :param color: color path
257
+ :type color: str
258
+ :param mask: mask path
259
+ :type mask: str
260
+ """
261
+
262
+ if inputs.rasterio_get_nb_bands(dsm) != 1:
263
+ raise RuntimeError("{} is not mono-band image".format(dsm))
264
+
265
+ for path in [mask, color, classif]:
266
+ if path is not None:
267
+ if inputs.rasterio_get_size(dsm) != inputs.rasterio_get_size(path):
268
+ raise RuntimeError(
269
+ "The image {} and {} "
270
+ "do not have the same size".format(dsm, path)
271
+ )
272
+
273
+
274
+ def modify_to_absolute_path(config_dir, overloaded_conf):
275
+ """
276
+ Modify input file path to absolute path
277
+
278
+ :param config_dir: directory of the json configuration
279
+ :type config_dir: str
280
+ :param overloaded_conf: overloaded configuration json
281
+ :dict overloaded_conf: dict
282
+ """
283
+ for dsm_key in overloaded_conf[dsm_cst.DSMS]:
284
+ dsms = overloaded_conf[dsm_cst.DSMS][dsm_key]
285
+ for tag in [
286
+ cst.INDEX_DSM_ALT,
287
+ cst.DSM_CLASSIF,
288
+ cst.INDEX_DSM_COLOR,
289
+ cst.INDEX_DSM_MASK,
290
+ cst.DSM_FILLING,
291
+ ]:
292
+ if dsms[tag] is not None:
293
+ dsms[tag] = make_relative_path_absolute(dsms[tag], config_dir)
294
+
295
+ if overloaded_conf[sens_cst.ROI] is not None:
296
+ if isinstance(overloaded_conf[sens_cst.ROI], str):
297
+ overloaded_conf[sens_cst.ROI] = make_relative_path_absolute(
298
+ overloaded_conf[sens_cst.ROI], config_dir
299
+ )
300
+
301
+
302
+ def check_phasing(dsm_dict):
303
+ """
304
+ Check if the dsm are phased, and if resolution and epsg code are equivalent
305
+
306
+ :param dsm_dict: list of phased dsm
307
+ :type dsm_dict: dict
308
+ """
309
+
310
+ ref_key = next(iter(dsm_dict))
311
+ ref_epsg = inputs.rasterio_get_epsg_code(dsm_dict[ref_key]["dsm"])
312
+ ref_profile = inputs.rasterio_get_profile(dsm_dict[ref_key]["dsm"])
313
+ ref_transform = list(ref_profile["transform"])
314
+ ref_res_x = ref_transform[0]
315
+ ref_res_y = ref_transform[4]
316
+ ref_bounds = inputs.rasterio_get_bounds(dsm_dict[ref_key]["dsm"])
317
+
318
+ for dsm_key in dsm_dict:
319
+ if dsm_key == ref_key:
320
+ continue
321
+
322
+ epsg = inputs.rasterio_get_epsg_code(dsm_dict[dsm_key]["dsm"])
323
+ profile = inputs.rasterio_get_profile(dsm_dict[ref_key]["dsm"])
324
+ transform = list(profile["transform"])
325
+ res_x = transform[0]
326
+ res_y = transform[4]
327
+ bounds = inputs.rasterio_get_bounds(dsm_dict[dsm_key]["dsm"])
328
+
329
+ if epsg != ref_epsg:
330
+ raise RuntimeError(
331
+ f"EPSG mismatch: DSM {dsm_key} has EPSG {epsg}, "
332
+ f"expected {ref_epsg}."
333
+ )
334
+
335
+ if ref_res_x != res_x or ref_res_y != res_y:
336
+ raise RuntimeError(
337
+ f"Resolution mismatch: DSM {dsm_key} has resolution "
338
+ f"{(res_x, res_y)}, expected {(ref_res_x, ref_res_y)}."
339
+ )
340
+
341
+ # Compare the left_bottom corner
342
+ diff = ref_bounds[0:2] - bounds[0:2]
343
+ resolution = np.array([ref_res_x, -ref_res_y])
344
+ res_ratio = diff / resolution
345
+
346
+ if ~np.all(np.equal(res_ratio, res_ratio.astype(int))) and ~np.all(
347
+ np.equal(1 / res_ratio, (1 / res_ratio).astype(int))
348
+ ):
349
+ raise RuntimeError(f"DSM {dsm_key} and {ref_key} are not phased")
@@ -0,0 +1,25 @@
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
+ CARS phased dsms to full resolution dsm pipeline constants file
23
+ """
24
+
25
+ DSMS = "dsms"
@@ -0,0 +1,52 @@
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
+ """
23
+ This module contains the output constants
24
+ """
25
+
26
+ # Pipeline output keys
27
+ OUT_DIRECTORY = "directory"
28
+ PRODUCT_LEVEL = "product_level"
29
+ INFO_FILENAME = "metadata.yaml"
30
+ OUT_GEOID = "geoid"
31
+ EPSG = "epsg"
32
+ RESOLUTION = "resolution"
33
+ SAVE_BY_PAIR = "save_by_pair"
34
+ AUXILIARY = "auxiliary"
35
+
36
+ # Auxiliary keys
37
+ AUX_IMAGE = "image"
38
+ AUX_WEIGHTS = "weights"
39
+ AUX_MASK = "mask"
40
+ AUX_CLASSIFICATION = "classification"
41
+ AUX_PERFORMANCE_MAP = "performance_map"
42
+ AUX_FILLING = "filling"
43
+ AUX_CONTRIBUTING_PAIR = "contributing_pair"
44
+ AUX_AMBIGUITY = "ambiguity"
45
+
46
+ AUX_DEM_MIN = "dem_min"
47
+ AUX_DEM_MAX = "dem_max"
48
+ AUX_DEM_MEDIAN = "dem_median"
49
+
50
+
51
+ # Output tree constants
52
+ DSM_DIRECTORY = "dsm"