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.
- cars/__init__.py +74 -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 +46 -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.cpython-313-x86_64-linux-gnu.so +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 +1130 -0
- cars/core/geometry/shareloc_geometry.py +604 -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 +1095 -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 +190 -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 +435 -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.0rc3.dist-info/METADATA +289 -0
- cars-1.0.0rc3.dist-info/RECORD +220 -0
- cars-1.0.0rc3.dist-info/WHEEL +6 -0
- cars-1.0.0rc3.dist-info/entry_points.txt +8 -0
cars/core/roi_tools.py
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
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
|
+
This module contains tools for ROI
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
import logging
|
|
26
|
+
import os
|
|
27
|
+
from typing import List, Tuple
|
|
28
|
+
|
|
29
|
+
import numpy as np
|
|
30
|
+
from shapely.geometry import LineString, MultiPolygon, Point, Polygon, shape
|
|
31
|
+
|
|
32
|
+
# CARS imports
|
|
33
|
+
from cars.core import inputs, projection
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def generate_roi_poly_from_inputs(roi):
|
|
37
|
+
"""
|
|
38
|
+
Generate ROI polygon from roi inputs
|
|
39
|
+
|
|
40
|
+
:param roi: roi file path or Geojson
|
|
41
|
+
:type roi: str Or GeoJson Dict
|
|
42
|
+
|
|
43
|
+
:return polygon, polygon epsg
|
|
44
|
+
:rtype: Tuple(Shapely Polygon, int)
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
roi_poly, roi_epsg = None, None
|
|
49
|
+
# Transform ROI if from shapefile
|
|
50
|
+
if isinstance(roi, str):
|
|
51
|
+
# Transform file to shapely polygon
|
|
52
|
+
|
|
53
|
+
roi_poly, roi_epsg = parse_roi_file(roi)
|
|
54
|
+
elif isinstance(roi, dict):
|
|
55
|
+
# Transform geosjon to shapely polygon
|
|
56
|
+
roi_poly, roi_epsg = geojson_to_shapely(roi)
|
|
57
|
+
|
|
58
|
+
# Resample polygon to a 100m resolution
|
|
59
|
+
if roi_poly is not None:
|
|
60
|
+
roi_poly = resample_polygon(roi_poly, roi_epsg, resolution=100)
|
|
61
|
+
|
|
62
|
+
return roi_poly, roi_epsg
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def resample_polygon(roi_poly, roi_epsg, resolution=100):
|
|
66
|
+
"""
|
|
67
|
+
Resample input polygon to given resolution.
|
|
68
|
+
No interpolation is applied.
|
|
69
|
+
|
|
70
|
+
:param roi_poly: input polygon or multipolygon
|
|
71
|
+
:type roi_poly: Shapely Polygon or MultiPolygon
|
|
72
|
+
:param roi_epsg: roi epsg
|
|
73
|
+
:type roi_epsg: int
|
|
74
|
+
:param resolution: resolution in meter to resample to
|
|
75
|
+
:type resolution: float
|
|
76
|
+
|
|
77
|
+
:return: resampled polygon
|
|
78
|
+
:rtype: Shapely Polygon or MultiPolygon
|
|
79
|
+
|
|
80
|
+
"""
|
|
81
|
+
epsg_meter = 4978
|
|
82
|
+
|
|
83
|
+
if roi_poly.geom_type == "Polygon":
|
|
84
|
+
list_poly = [roi_poly]
|
|
85
|
+
elif roi_poly.geom_type == "MultiPolygon":
|
|
86
|
+
list_poly = list(roi_poly.geoms)
|
|
87
|
+
else:
|
|
88
|
+
raise TypeError(
|
|
89
|
+
"{} type is not supported for ROI".format(roi_poly.geom_type)
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
new_list_poly = []
|
|
93
|
+
for poly in list_poly:
|
|
94
|
+
new_list_points = []
|
|
95
|
+
|
|
96
|
+
points = poly.boundary.coords
|
|
97
|
+
|
|
98
|
+
linestrings = [
|
|
99
|
+
LineString(points[k : k + 2]) for k in range(len(points) - 1)
|
|
100
|
+
]
|
|
101
|
+
for line in linestrings:
|
|
102
|
+
# Get distance in meter of line
|
|
103
|
+
first, last = line.coords[0], line.coords[1]
|
|
104
|
+
in_cloud = np.array([[first[0], first[1]], [last[0], last[1]]])
|
|
105
|
+
out_cloud = projection.point_cloud_conversion(
|
|
106
|
+
in_cloud, roi_epsg, epsg_meter
|
|
107
|
+
)
|
|
108
|
+
new_first = Point(out_cloud[0, 0], out_cloud[0, 1])
|
|
109
|
+
new_last = Point(out_cloud[1, 0], out_cloud[1, 1])
|
|
110
|
+
line_distance = new_first.distance(new_last)
|
|
111
|
+
|
|
112
|
+
# Compute number of point to generate
|
|
113
|
+
nb_points = int(line_distance / resolution) + 1
|
|
114
|
+
|
|
115
|
+
# Generate new points
|
|
116
|
+
for ind in list(np.linspace(0, 1, nb_points, endpoint=True)):
|
|
117
|
+
new_list_points.append(line.interpolate(ind, normalized=True))
|
|
118
|
+
|
|
119
|
+
new_list_poly.append(Polygon(new_list_points))
|
|
120
|
+
|
|
121
|
+
if roi_poly.geom_type == "Polygon":
|
|
122
|
+
return new_list_poly[0]
|
|
123
|
+
return MultiPolygon(new_list_poly)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def geojson_to_shapely(geojson_dict: dict):
|
|
127
|
+
"""
|
|
128
|
+
Transform Geojson dict to Shapely polygon
|
|
129
|
+
|
|
130
|
+
:param geojson_dict: geojson
|
|
131
|
+
:type geojson_dict: dict
|
|
132
|
+
|
|
133
|
+
:return: shapely polygon
|
|
134
|
+
:rtype: Shapely Polygon
|
|
135
|
+
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
features = geojson_dict["features"]
|
|
139
|
+
if len(features) > 1:
|
|
140
|
+
logging.info(
|
|
141
|
+
"Multi features files are not supported, "
|
|
142
|
+
"the first feature of input geojson will be used"
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
roi_poly = shape(features[0]["geometry"]).buffer(0)
|
|
146
|
+
|
|
147
|
+
roi_epsg = 4326
|
|
148
|
+
|
|
149
|
+
if "crs" in geojson_dict:
|
|
150
|
+
if "properties" in geojson_dict["crs"]:
|
|
151
|
+
if "name" in geojson_dict["crs"]["properties"]:
|
|
152
|
+
geo_json_epsg = geojson_dict["crs"]["properties"]["name"]
|
|
153
|
+
# format: EPSG:4326
|
|
154
|
+
if "EPSG:" not in geo_json_epsg:
|
|
155
|
+
logging.error("ROI EPSG could not be read, wrong format")
|
|
156
|
+
else:
|
|
157
|
+
roi_epsg = int(geo_json_epsg.replace("EPSG:", ""))
|
|
158
|
+
|
|
159
|
+
return roi_poly, roi_epsg
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def parse_roi_file(arg_roi_file: str) -> Tuple[List[float], int]:
|
|
163
|
+
"""
|
|
164
|
+
Parse ROI file argument and generate bounding box
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
:param arg_roi_file : ROI file argument
|
|
168
|
+
:return: ROI Polygon + ROI epsg
|
|
169
|
+
:rtype: Shapely polygon, int
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
# Declare output
|
|
173
|
+
roi_poly, roi_epsg = None, None
|
|
174
|
+
|
|
175
|
+
_, extension = os.path.splitext(arg_roi_file)
|
|
176
|
+
|
|
177
|
+
# test file existence
|
|
178
|
+
if not os.path.exists(arg_roi_file):
|
|
179
|
+
logging.error("File {} does not exist".format(arg_roi_file))
|
|
180
|
+
else:
|
|
181
|
+
# if it is a vector file
|
|
182
|
+
if extension in [".gpkg", ".shp", ".kml"]:
|
|
183
|
+
roi_poly, roi_epsg = inputs.read_vector(arg_roi_file)
|
|
184
|
+
|
|
185
|
+
else:
|
|
186
|
+
logging.error(
|
|
187
|
+
"ROI file {} has an unsupported format".format(arg_roi_file)
|
|
188
|
+
)
|
|
189
|
+
raise AttributeError(
|
|
190
|
+
"ROI file {} has an unsupported format".format(arg_roi_file)
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
return roi_poly, roi_epsg
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def bounds_to_poly(bounds):
|
|
197
|
+
"""
|
|
198
|
+
Convert bounds to polygon
|
|
199
|
+
|
|
200
|
+
:param bounds: bounds: [xmin, ymin, xmax, ymax]
|
|
201
|
+
:type: bounds: list
|
|
202
|
+
|
|
203
|
+
:return polygon
|
|
204
|
+
"""
|
|
205
|
+
|
|
206
|
+
poly = Polygon(
|
|
207
|
+
[
|
|
208
|
+
[bounds[0], bounds[1]],
|
|
209
|
+
[bounds[0], bounds[3]],
|
|
210
|
+
[bounds[2], bounds[3]],
|
|
211
|
+
[bounds[2], bounds[1]],
|
|
212
|
+
[bounds[0], bounds[1]],
|
|
213
|
+
]
|
|
214
|
+
)
|
|
215
|
+
return poly
|