ign-borea 0.1.5__py3-none-any.whl → 0.2.1__py3-none-any.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.
- borea/datastruct/shot.py +9 -3
- borea/datastruct/workdata.py +19 -12
- borea/format/conl.py +1 -5
- borea/format/rpc.py +10 -3
- borea/geodesy/local_euclidean_proj.py +9 -9
- borea/geodesy/proj_engine.py +10 -7
- borea/geodesy/transform_geodesy.py +171 -45
- borea/process/p_add_data/p_gen_param.py +3 -14
- borea/process/p_add_data/p_proj.py +57 -0
- borea/process/p_add_data/p_unit_shot.py +3 -3
- borea/process/p_format/p_write_opk.py +5 -5
- borea/process/p_func/p_spaceresection.py +2 -2
- borea/process/p_func/p_tf_proj_pt.py +50 -0
- borea/reader/orientation/reader_opk.py +3 -3
- borea/reader/reader_point.py +4 -4
- borea/transform_world_image/transform_shot/conversion_coor_shot.py +4 -4
- borea/transform_world_image/transform_shot/image_world_shot.py +1 -1
- borea/transform_world_image/transform_shot/world_image_shot.py +1 -1
- borea/transform_world_image/transform_worksite/image_world_least_square.py +1 -1
- borea/worksite/worksite.py +10 -5
- borea/writer/writer_con.py +8 -1
- borea/writer/writer_opk.py +1 -1
- borea/writer/writer_rpc.py +4 -1
- borea_tools/spaceresection_opk.py +2 -2
- borea_tools/transform_proj_points.py +30 -0
- {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/METADATA +2 -3
- {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/RECORD +31 -28
- {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/WHEEL +1 -1
- {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/entry_points.txt +1 -0
- {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/LICENSE +0 -0
- {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/top_level.txt +0 -0
borea/datastruct/shot.py
CHANGED
|
@@ -9,7 +9,7 @@ from borea.geodesy.local_euclidean_proj import LocalEuclideanProj
|
|
|
9
9
|
from borea.utils.check.check_order_axe import check_order_axe
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
# pylint: disable=too-many-instance-attributes too-many-arguments
|
|
12
|
+
# pylint: disable=too-many-instance-attributes too-many-arguments too-many-positional-arguments
|
|
13
13
|
class Shot:
|
|
14
14
|
"""
|
|
15
15
|
Shot class definition.
|
|
@@ -153,9 +153,9 @@ class Shot:
|
|
|
153
153
|
type_z (str): z type height or altitude.
|
|
154
154
|
"""
|
|
155
155
|
if type_z == "height":
|
|
156
|
-
self.pos_shot[2] = ProjEngine().tranform_height(self.pos_shot)
|
|
156
|
+
self.pos_shot[2] = ProjEngine().tf.tranform_height(self.pos_shot)
|
|
157
157
|
else:
|
|
158
|
-
self.pos_shot[2] = ProjEngine().tranform_altitude(self.pos_shot)
|
|
158
|
+
self.pos_shot[2] = ProjEngine().tf.tranform_altitude(self.pos_shot)
|
|
159
159
|
|
|
160
160
|
def set_linear_alteration(self, linear_alteration: bool) -> None:
|
|
161
161
|
"""
|
|
@@ -185,6 +185,12 @@ class Shot:
|
|
|
185
185
|
self.ori_shot = -(R.from_euler("x", np.pi) *
|
|
186
186
|
R.from_matrix(self.mat_rot)).as_euler(order_xyz, degrees=unitori)
|
|
187
187
|
|
|
188
|
+
def set_proj_pos(self) -> None:
|
|
189
|
+
"""
|
|
190
|
+
Change the projection of the position shot with the epsg_output.
|
|
191
|
+
"""
|
|
192
|
+
self.pos_shot = np.array(ProjEngine().tf.proj_to_proj_out(*self.pos_shot))
|
|
193
|
+
|
|
188
194
|
def get_z_remove_scale_factor(self) -> float:
|
|
189
195
|
"""
|
|
190
196
|
Return Z after removing the scale factor. The Z of the object is NOT modified.
|
borea/datastruct/workdata.py
CHANGED
|
@@ -33,8 +33,9 @@ class Workdata:
|
|
|
33
33
|
self.type_z_data = None
|
|
34
34
|
self.type_z_shot = None
|
|
35
35
|
self.approxeucli = False
|
|
36
|
+
self.epsg_output = False
|
|
36
37
|
|
|
37
|
-
# pylint: disable-next=too-many-arguments
|
|
38
|
+
# pylint: disable-next=too-many-arguments too-many-positional-arguments
|
|
38
39
|
def add_shot(self, name_shot: str, pos_shot: np.ndarray,
|
|
39
40
|
ori_shot: np.ndarray, name_cam: str,
|
|
40
41
|
unit_angle: str, linear_alteration: bool,
|
|
@@ -59,24 +60,30 @@ class Workdata:
|
|
|
59
60
|
linear_alteration=linear_alteration,
|
|
60
61
|
order_axe=order_axe)
|
|
61
62
|
|
|
62
|
-
def set_proj(self, epsg:
|
|
63
|
+
def set_proj(self, epsg: list, path_geoid: list = None, epsg_output: int = None) -> None:
|
|
63
64
|
"""
|
|
64
65
|
Setup a projection system to the worksite.
|
|
65
66
|
|
|
66
67
|
Args:
|
|
67
|
-
epsg (
|
|
68
|
+
epsg (list): Code epsg of the projection ex: [2154].
|
|
68
69
|
path_geoid (str): List of GeoTIFF which represents the geoid in grid form.
|
|
70
|
+
epsg_output (int): Code epsg of the output projection. If you want to change.
|
|
69
71
|
"""
|
|
70
72
|
ProjEngine.clear()
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
73
|
+
for idepsg in [*epsg, epsg_output]:
|
|
74
|
+
if idepsg:
|
|
75
|
+
try: # Check if the epsg exist
|
|
76
|
+
_ = CRS.from_epsg(idepsg)
|
|
77
|
+
del _
|
|
78
|
+
except exceptions.CRSError as e_info:
|
|
79
|
+
raise exceptions.CRSError(f"Your EPSG:{epsg}"
|
|
80
|
+
" doesn't exist in pyproj.") from e_info
|
|
81
|
+
if epsg_output:
|
|
82
|
+
self.epsg_output = True
|
|
83
|
+
|
|
84
|
+
ProjEngine().set_epsg(epsg, path_geoid, epsg_output)
|
|
85
|
+
|
|
86
|
+
# pylint: disable-next=too-many-arguments too-many-positional-arguments
|
|
80
87
|
def add_camera(self, name_camera: str, ppax: float, ppay: float,
|
|
81
88
|
focal: float, width: int, height: int) -> None:
|
|
82
89
|
"""
|
borea/format/conl.py
CHANGED
|
@@ -33,19 +33,15 @@ class Conl:
|
|
|
33
33
|
cam: Camera
|
|
34
34
|
proj: str
|
|
35
35
|
|
|
36
|
-
def save_conl(self, path_conical: Path
|
|
36
|
+
def save_conl(self, path_conical: Path) -> None:
|
|
37
37
|
"""
|
|
38
38
|
Save the shot as light conical file.
|
|
39
39
|
|
|
40
40
|
Args:
|
|
41
41
|
path_conical (Path): path to the light conical file.
|
|
42
|
-
linalt (bool): If you want z shot corrected by linear alteration.
|
|
43
42
|
"""
|
|
44
43
|
date_now = datetime.now()
|
|
45
44
|
|
|
46
|
-
# Scale factor correction
|
|
47
|
-
self.shot.set_linear_alteration(linalt)
|
|
48
|
-
|
|
49
45
|
# creation XML
|
|
50
46
|
ori = ET.Element("orientation", {})
|
|
51
47
|
ET.SubElement(ori, "lastmodificationbylibori",
|
borea/format/rpc.py
CHANGED
|
@@ -22,6 +22,7 @@ class Rpc:
|
|
|
22
22
|
def __init__(self) -> None:
|
|
23
23
|
self.param_rpc = {}
|
|
24
24
|
self.fact_rpc = None
|
|
25
|
+
self.output_epsg = False
|
|
25
26
|
|
|
26
27
|
@classmethod
|
|
27
28
|
def from_shot(cls, shot: Shot, cam: Camera, param_rpc: dict, unit_data: dict) -> None:
|
|
@@ -46,6 +47,7 @@ class Rpc:
|
|
|
46
47
|
"""
|
|
47
48
|
obj = cls()
|
|
48
49
|
obj.fact_rpc = param_rpc["fact_rpc"]
|
|
50
|
+
obj.output_epsg = param_rpc["epsg_output"]
|
|
49
51
|
obj.param_rpc["ERR_BIAS"] = -1
|
|
50
52
|
obj.param_rpc["ERR_RAND"] = -1
|
|
51
53
|
|
|
@@ -107,9 +109,14 @@ class Rpc:
|
|
|
107
109
|
tuple: grid image normalize and grid world normalize.
|
|
108
110
|
"""
|
|
109
111
|
if self.fact_rpc is None:
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
112
|
+
if self.output_epsg:
|
|
113
|
+
x_geog, y_geog, z_geog = ProjEngine().tf.proj_to_proj_out(grid_world[0],
|
|
114
|
+
grid_world[1],
|
|
115
|
+
grid_world[2])
|
|
116
|
+
else:
|
|
117
|
+
x_geog, y_geog, z_geog = ProjEngine().tf.carto_to_geog(grid_world[0],
|
|
118
|
+
grid_world[1],
|
|
119
|
+
grid_world[2])
|
|
113
120
|
else:
|
|
114
121
|
x_geog = grid_world[0]*self.fact_rpc
|
|
115
122
|
y_geog = grid_world[1]*self.fact_rpc
|
|
@@ -37,7 +37,7 @@ class LocalEuclideanProj(EuclideanProj):
|
|
|
37
37
|
Returns:
|
|
38
38
|
np.array: Transition matrix.
|
|
39
39
|
"""
|
|
40
|
-
lon, lat = ProjEngine().carto_to_geog(x, y)
|
|
40
|
+
lon, lat = ProjEngine().tf.carto_to_geog(x, y)
|
|
41
41
|
gamma = ProjEngine().get_meridian_convergence(x, y)
|
|
42
42
|
|
|
43
43
|
# Matrix for switching to local cartesian coordinates
|
|
@@ -92,10 +92,10 @@ class LocalEuclideanProj(EuclideanProj):
|
|
|
92
92
|
"""
|
|
93
93
|
coor = check_array_transfo(coor[0], coor[1], coor[2])
|
|
94
94
|
|
|
95
|
-
coor_geoc = np.array(ProjEngine().carto_to_geoc(coor[0], coor[1], coor[2]))
|
|
96
|
-
central_geoc = np.array(ProjEngine().carto_to_geoc(self.pt_central[0],
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
coor_geoc = np.array(ProjEngine().tf.carto_to_geoc(coor[0], coor[1], coor[2]))
|
|
96
|
+
central_geoc = np.array(ProjEngine().tf.carto_to_geoc(self.pt_central[0],
|
|
97
|
+
self.pt_central[1],
|
|
98
|
+
self.pt_central[2]))
|
|
99
99
|
dr = np.vstack([coor_geoc[0] - central_geoc[0],
|
|
100
100
|
coor_geoc[1] - central_geoc[1],
|
|
101
101
|
coor_geoc[2] - central_geoc[2]])
|
|
@@ -115,13 +115,13 @@ class LocalEuclideanProj(EuclideanProj):
|
|
|
115
115
|
"""
|
|
116
116
|
coor = np.squeeze(coor)
|
|
117
117
|
|
|
118
|
-
central_geoc = np.array(ProjEngine().carto_to_geoc(self.pt_central[0],
|
|
119
|
-
|
|
120
|
-
|
|
118
|
+
central_geoc = np.array(ProjEngine().tf.carto_to_geoc(self.pt_central[0],
|
|
119
|
+
self.pt_central[1],
|
|
120
|
+
self.pt_central[2]))
|
|
121
121
|
dr = np.vstack([coor[0] - self.pt_central[0],
|
|
122
122
|
coor[1] - self.pt_central[1],
|
|
123
123
|
coor[2] - self.pt_central[2]])
|
|
124
124
|
point_geoc = np.squeeze((self.rot_to_euclidean_local.T @ dr) + np.array([central_geoc]).T)
|
|
125
125
|
x_gc, y_gc, z_gc = check_array_transfo(point_geoc[0], point_geoc[1], point_geoc[2])
|
|
126
|
-
tup = ProjEngine().geoc_to_carto(x_gc, y_gc, z_gc)
|
|
126
|
+
tup = ProjEngine().tf.geoc_to_carto(x_gc, y_gc, z_gc)
|
|
127
127
|
return np.array([tup[0], tup[1], tup[2]])
|
borea/geodesy/proj_engine.py
CHANGED
|
@@ -11,30 +11,33 @@ from borea.utils.singleton.singleton import Singleton
|
|
|
11
11
|
|
|
12
12
|
# pylint: disable=unpacking-non-sequence
|
|
13
13
|
@dataclass
|
|
14
|
-
class ProjEngine(
|
|
14
|
+
class ProjEngine(metaclass=Singleton):
|
|
15
15
|
"""
|
|
16
16
|
This class provides functions for using a cartographic system.
|
|
17
17
|
"""
|
|
18
18
|
epsg: int = None
|
|
19
19
|
geoid: list = None
|
|
20
|
+
epsg_output: int = None
|
|
20
21
|
|
|
21
22
|
def __post_init__(self) -> None:
|
|
22
23
|
if self.epsg:
|
|
23
|
-
self.crs = pyproj.CRS.from_epsg(self.epsg)
|
|
24
|
+
self.crs = pyproj.CRS.from_epsg(self.epsg[0])
|
|
24
25
|
self.proj = pyproj.Proj(self.crs)
|
|
25
|
-
TransformGeodesy
|
|
26
|
+
self.tf = TransformGeodesy(self.epsg, self.geoid, self.epsg_output)
|
|
26
27
|
|
|
27
|
-
def set_epsg(self, epsg:
|
|
28
|
+
def set_epsg(self, epsg: list, geoid: list = None, epsg_output: int = None) -> None:
|
|
28
29
|
"""
|
|
29
30
|
Setter of the class ProjEngine.
|
|
30
31
|
Allows to init the class with data.
|
|
31
32
|
|
|
32
33
|
Args:
|
|
33
|
-
epsg (
|
|
34
|
+
epsg (list): Code epsg of the projection ex: [2154].
|
|
34
35
|
geoid (list): List of geoid to use.
|
|
36
|
+
epsg_output (int): Code epsg of the output projection. If you want to change.
|
|
35
37
|
"""
|
|
36
38
|
self.epsg = epsg
|
|
37
39
|
self.geoid = geoid
|
|
40
|
+
self.epsg_output = epsg_output
|
|
38
41
|
self.__post_init__()
|
|
39
42
|
|
|
40
43
|
def get_meridian_convergence(self, x_carto: Union[np.ndarray, List[float], float],
|
|
@@ -50,7 +53,7 @@ class ProjEngine(TransformGeodesy, metaclass=Singleton):
|
|
|
50
53
|
Returns:
|
|
51
54
|
np.array : Meridian convergence in degree.
|
|
52
55
|
"""
|
|
53
|
-
(x_geog, y_geog) = self.carto_to_geog(x_carto, y_carto)
|
|
56
|
+
(x_geog, y_geog) = self.tf.carto_to_geog(x_carto, y_carto)
|
|
54
57
|
return -np.array(self.proj.get_factors(x_geog, y_geog).meridian_convergence)
|
|
55
58
|
|
|
56
59
|
def get_scale_factor(self, x_carto: Union[np.ndarray, List[float], float],
|
|
@@ -66,5 +69,5 @@ class ProjEngine(TransformGeodesy, metaclass=Singleton):
|
|
|
66
69
|
Returns:
|
|
67
70
|
np.array: Scale factor and meridian convergence.
|
|
68
71
|
"""
|
|
69
|
-
x_geog, y_geog = self.carto_to_geog(x_carto, y_carto)
|
|
72
|
+
x_geog, y_geog = self.tf.carto_to_geog(x_carto, y_carto)
|
|
70
73
|
return np.array(self.proj.get_factors(x_geog, y_geog).meridional_scale) - 1
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Module for class ProjEngine, transform geodesy
|
|
3
3
|
"""
|
|
4
|
-
from dataclasses import dataclass
|
|
5
4
|
import pyproj
|
|
6
5
|
import numpy as np
|
|
6
|
+
import pandas as pd
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
# pylint: disable=
|
|
10
|
-
@dataclass
|
|
9
|
+
# pylint: disable=too-many-instance-attributes
|
|
11
10
|
class TransformGeodesy():
|
|
12
11
|
"""
|
|
13
12
|
This class provides functions to tranform coordinate system.
|
|
@@ -16,50 +15,157 @@ class TransformGeodesy():
|
|
|
16
15
|
|
|
17
16
|
Args:
|
|
18
17
|
geoid (list): List of geoid to use.
|
|
19
|
-
|
|
18
|
+
epsg (list): Code epsg of the projection ex: [2154].
|
|
19
|
+
epsg_output (int): Code epsg of the output projection. If you want to change.
|
|
20
20
|
"""
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
self.
|
|
33
|
-
# Transform geographic coordinates to cartographic coordinates
|
|
34
|
-
self.geog_to_carto = pyproj.Transformer.from_crs(crs_geog, crs).transform
|
|
35
|
-
# Transform cartographic coordinates to geocentric coordinates
|
|
36
|
-
self.carto_to_geoc = pyproj.Transformer.from_crs(crs, crs_geoc).transform
|
|
37
|
-
# Transform geocentric coordinates to cartographic coordinates
|
|
38
|
-
self.geoc_to_carto = pyproj.Transformer.from_crs(crs_geoc, crs).transform
|
|
39
|
-
|
|
40
|
-
if geoid:
|
|
41
|
-
self.tf_geoid(geoid)
|
|
42
|
-
|
|
43
|
-
def tf_geoid(self, geoid: list) -> None:
|
|
44
|
-
"""
|
|
45
|
-
Create attribute transform, to transform geographic coordinates to geoide coordinates.
|
|
21
|
+
def __init__(self, epsg: list, geoid: list, epsg_output: int) -> None:
|
|
22
|
+
self.epsg = epsg
|
|
23
|
+
self.epsg_output = epsg_output
|
|
24
|
+
self.crs = pyproj.CRS.from_epsg(epsg[0])
|
|
25
|
+
self.geoid = geoid
|
|
26
|
+
self._carto_to_geoc = None
|
|
27
|
+
self._geoc_to_carto = None
|
|
28
|
+
self._carto_to_geog = None
|
|
29
|
+
self._geog_to_carto = None
|
|
30
|
+
self._geog_to_geoid = None
|
|
31
|
+
self._geoid_to_geog = None
|
|
32
|
+
self._proj_to_proj_out = None
|
|
46
33
|
|
|
47
|
-
|
|
48
|
-
|
|
34
|
+
@property
|
|
35
|
+
def carto_to_geog(self) -> pyproj.Transformer:
|
|
49
36
|
"""
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
37
|
+
Returns the transformation or instantiates it before returning it.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
pyproj.Transformer : carto_to_geog
|
|
41
|
+
"""
|
|
42
|
+
if not self._carto_to_geog:
|
|
43
|
+
try:
|
|
44
|
+
crs_geog = pyproj.CRS.from_epsg(self.epsg[1])
|
|
45
|
+
except (IndexError, pyproj.exceptions.CRSError):
|
|
46
|
+
crs_geog = pyproj.crs.GeographicCRS(name=self.crs.name, datum=self.crs.datum.name)
|
|
47
|
+
|
|
48
|
+
self._carto_to_geog = pyproj.Transformer.from_crs(self.crs, crs_geog).transform
|
|
49
|
+
|
|
50
|
+
return self._carto_to_geog
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def geog_to_carto(self) -> pyproj.Transformer:
|
|
54
|
+
"""
|
|
55
|
+
Returns the transformation or instantiates it before returning it.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
pyproj.Transformer : geog_to_carto
|
|
59
|
+
"""
|
|
60
|
+
if not self._geog_to_carto:
|
|
61
|
+
try:
|
|
62
|
+
crs_geog = pyproj.CRS.from_epsg(self.epsg[1])
|
|
63
|
+
except (IndexError, pyproj.exceptions.CRSError):
|
|
64
|
+
crs_geog = pyproj.crs.GeographicCRS(name=self.crs.name, datum=self.crs.datum.name)
|
|
65
|
+
|
|
66
|
+
self._geog_to_carto = pyproj.Transformer.from_crs(crs_geog, self.crs).transform
|
|
67
|
+
|
|
68
|
+
return self._geog_to_carto
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def carto_to_geoc(self) -> pyproj.Transformer:
|
|
72
|
+
"""
|
|
73
|
+
Returns the transformation or instantiates it before returning it.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
pyproj.Transformer : carto_to_geoc
|
|
77
|
+
"""
|
|
78
|
+
if not self._carto_to_geoc:
|
|
79
|
+
try:
|
|
80
|
+
crs_geoc = pyproj.CRS.from_epsg(self.epsg[2])
|
|
81
|
+
except (IndexError, pyproj.exceptions.CRSError):
|
|
82
|
+
crs_geoc = pyproj.crs.GeocentricCRS(name=self.crs.name, datum=self.crs.datum.name)
|
|
83
|
+
|
|
84
|
+
self._carto_to_geoc = pyproj.Transformer.from_crs(self.crs, crs_geoc).transform
|
|
85
|
+
|
|
86
|
+
return self._carto_to_geoc
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def geoc_to_carto(self) -> pyproj.Transformer:
|
|
90
|
+
"""
|
|
91
|
+
Returns the transformation or instantiates it before returning it.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
pyproj.Transformer : geoc_to_carto
|
|
95
|
+
"""
|
|
96
|
+
if not self._geoc_to_carto:
|
|
97
|
+
try:
|
|
98
|
+
crs_geoc = pyproj.CRS.from_epsg(self.epsg[2])
|
|
99
|
+
except (IndexError, pyproj.exceptions.CRSError):
|
|
100
|
+
crs_geoc = pyproj.crs.GeocentricCRS(name=self.crs.name, datum=self.crs.datum.name)
|
|
101
|
+
|
|
102
|
+
self._geoc_to_carto = pyproj.Transformer.from_crs(crs_geoc, self.crs).transform
|
|
103
|
+
|
|
104
|
+
return self._geoc_to_carto
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def geoid_to_geog(self) -> pyproj.Transformer:
|
|
108
|
+
"""
|
|
109
|
+
Returns the transformation or instantiates it before returning it.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
pyproj.Transformer : geoid_to_geog
|
|
113
|
+
"""
|
|
114
|
+
if not self.geoid:
|
|
115
|
+
raise ValueError("Mistake Geoid path")
|
|
116
|
+
|
|
117
|
+
if not self._geoid_to_geog:
|
|
118
|
+
try:
|
|
119
|
+
# Transform geoide coordinates to geographic coordinates
|
|
120
|
+
self._geoid_to_geog = pyproj.Transformer.from_pipeline("+proj=vgridshift "
|
|
121
|
+
"+grids="
|
|
122
|
+
f"{','.join(self.geoid)} "
|
|
123
|
+
"+multiplier=1").transform
|
|
124
|
+
except pyproj.exceptions.ProjError as e:
|
|
125
|
+
raise pyproj.exceptions.ProjError(f"{self.geoid} The name or path "
|
|
126
|
+
"of geotif is incorrect or does not exist in "
|
|
127
|
+
f"{pyproj.datadir.get_data_dir()}!!!{e}") from e
|
|
128
|
+
|
|
129
|
+
return self._geoid_to_geog
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def geog_to_geoid(self) -> pyproj.Transformer:
|
|
133
|
+
"""
|
|
134
|
+
Returns the transformation or instantiates it before returning it.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
pyproj.Transformer : geog_to_geoid
|
|
138
|
+
"""
|
|
139
|
+
if not self.geoid:
|
|
140
|
+
raise ValueError("Mistake Geoid path")
|
|
141
|
+
|
|
142
|
+
if not self._geog_to_geoid:
|
|
143
|
+
try:
|
|
144
|
+
# Transform geoide coordinates to geographic coordinates
|
|
145
|
+
self._geog_to_geoid = pyproj.Transformer.from_pipeline("+proj=vgridshift "
|
|
146
|
+
"+grids="
|
|
147
|
+
f"{','.join(self.geoid)} "
|
|
148
|
+
"+multiplier=-1").transform
|
|
149
|
+
except pyproj.exceptions.ProjError as e:
|
|
150
|
+
raise pyproj.exceptions.ProjError(f"{self.geoid} The name or path "
|
|
151
|
+
"of geotif is incorrect or does not exist in "
|
|
152
|
+
f"{pyproj.datadir.get_data_dir()}!!!{e}") from e
|
|
153
|
+
|
|
154
|
+
return self._geog_to_geoid
|
|
155
|
+
|
|
156
|
+
@property
|
|
157
|
+
def proj_to_proj_out(self) -> pyproj.Transformer:
|
|
158
|
+
"""
|
|
159
|
+
Create the pyproj Transformer from crs of worksite to crs geographic ask.
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
pyproj.Transformer : carto_to_geog_out
|
|
163
|
+
"""
|
|
164
|
+
if not self._proj_to_proj_out:
|
|
165
|
+
crs_out = pyproj.CRS.from_epsg(self.epsg_output)
|
|
166
|
+
self._proj_to_proj_out = pyproj.Transformer.from_crs(self.crs, crs_out).transform
|
|
167
|
+
|
|
168
|
+
return self._proj_to_proj_out
|
|
63
169
|
|
|
64
170
|
def tranform_height(self, coor: np.ndarray) -> float:
|
|
65
171
|
"""
|
|
@@ -83,7 +189,7 @@ class TransformGeodesy():
|
|
|
83
189
|
raise ValueError("The geoid has not been entered, "
|
|
84
190
|
"cannot transform z altitude to height.") from info
|
|
85
191
|
|
|
86
|
-
if new_z == np.inf:
|
|
192
|
+
if np.all(new_z == np.inf):
|
|
87
193
|
raise ValueError("out geoid")
|
|
88
194
|
return new_z
|
|
89
195
|
|
|
@@ -112,3 +218,23 @@ class TransformGeodesy():
|
|
|
112
218
|
if np.all(new_z == np.inf):
|
|
113
219
|
raise ValueError("out geoid")
|
|
114
220
|
return new_z
|
|
221
|
+
|
|
222
|
+
def transform_pt_proj(self, df_pt: pd.DataFrame, type_z_input: str = None,
|
|
223
|
+
type_z_output: str = None) -> pd.DataFrame:
|
|
224
|
+
"""
|
|
225
|
+
Tranform the input projection to the output projection of points coordinates
|
|
226
|
+
"""
|
|
227
|
+
if type_z_input and type_z_output:
|
|
228
|
+
if type_z_input != type_z_output:
|
|
229
|
+
if type_z_output == "altitude":
|
|
230
|
+
df_pt["z"] = self.tranform_altitude(np.array([df_pt['x'],
|
|
231
|
+
df_pt['y'],
|
|
232
|
+
df_pt['z']]))
|
|
233
|
+
if type_z_output == "height":
|
|
234
|
+
df_pt["z"] = self.tranform_height(np.array([df_pt['x'],
|
|
235
|
+
df_pt['y'],
|
|
236
|
+
df_pt['z']]))
|
|
237
|
+
|
|
238
|
+
df_pt["x"], df_pt["y"] = self.proj_to_proj_out(df_pt['x'], df_pt['y'])
|
|
239
|
+
|
|
240
|
+
return df_pt
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Args of parser for reading generals parameters
|
|
3
3
|
"""
|
|
4
4
|
import argparse
|
|
5
|
-
import pyproj
|
|
6
5
|
from borea.worksite.worksite import Worksite
|
|
6
|
+
from borea.process.p_add_data.p_proj import args_proj_param, process_args_proj_param
|
|
7
7
|
from borea.reader.reader_camera import read_camera
|
|
8
8
|
|
|
9
9
|
|
|
@@ -17,14 +17,7 @@ def args_general_param(parser: argparse) -> argparse:
|
|
|
17
17
|
Returns:
|
|
18
18
|
argsparse: Parser with argument.
|
|
19
19
|
"""
|
|
20
|
-
parser
|
|
21
|
-
type=int, default=None,
|
|
22
|
-
help='EPSG codifier number of the reference system used e.g. "2154".')
|
|
23
|
-
parser.add_argument('-y', '--pathgeoid',
|
|
24
|
-
type=str, nargs='*', default=None,
|
|
25
|
-
help='Path to the pyproj GeoTIFF of the geoid e.g../test/data/geoid.tif'
|
|
26
|
-
f' or they must be in {pyproj.datadir.get_data_dir()} and just'
|
|
27
|
-
' need name of file e.g. geoid.tif.')
|
|
20
|
+
parser = args_proj_param(parser)
|
|
28
21
|
parser.add_argument('-c', '--camera',
|
|
29
22
|
type=str, nargs='*',
|
|
30
23
|
help='Files paths of cameras (xml or txt).')
|
|
@@ -52,11 +45,7 @@ def process_args_gen_param(args: argparse, work: Worksite) -> Worksite:
|
|
|
52
45
|
Worksite: data
|
|
53
46
|
"""
|
|
54
47
|
# Add a projection to the worksite
|
|
55
|
-
|
|
56
|
-
work.set_proj(args.epsg, args.pathgeoid)
|
|
57
|
-
print(f"Projection set-up with EPSG:{args.epsg}.")
|
|
58
|
-
else:
|
|
59
|
-
print("There is no given projection.")
|
|
48
|
+
work = process_args_proj_param(args, work)
|
|
60
49
|
|
|
61
50
|
# Reading camera file
|
|
62
51
|
if args.camera is not None:
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Args of parser for reading projection parameters
|
|
3
|
+
"""
|
|
4
|
+
import argparse
|
|
5
|
+
import pyproj
|
|
6
|
+
from borea.worksite.worksite import Worksite
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def args_proj_param(parser: argparse) -> argparse:
|
|
10
|
+
"""
|
|
11
|
+
Args for adding projection parameter.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
parser (argparse): Parser to add argument.
|
|
15
|
+
|
|
16
|
+
Returns:
|
|
17
|
+
argsparse: Parser with argument.
|
|
18
|
+
"""
|
|
19
|
+
parser.add_argument('-e', '--epsg',
|
|
20
|
+
type=int, default=None,
|
|
21
|
+
help='EPSG codifier number of the reference system used e.g. "2154".')
|
|
22
|
+
parser.add_argument('-y', '--pathgeoid',
|
|
23
|
+
type=str, nargs='*', default=None,
|
|
24
|
+
help='Path to the pyproj GeoTIFF of the geoid e.g../test/data/geoid.tif'
|
|
25
|
+
f' or they must be in {pyproj.datadir.get_data_dir()} and just'
|
|
26
|
+
' need name of file e.g. geoid.tif.')
|
|
27
|
+
parser.add_argument('--geog', '--epsg_geographic',
|
|
28
|
+
type=int, default=None,
|
|
29
|
+
help='EPSG codifier number of the reference geographic system.')
|
|
30
|
+
parser.add_argument('--geoc', '--epsg_geocentric',
|
|
31
|
+
type=int, default=None,
|
|
32
|
+
help='EPSG codifier number of the reference geocentric system.')
|
|
33
|
+
parser.add_argument('--oe', '--epsg_output',
|
|
34
|
+
type=int, default=None,
|
|
35
|
+
help="Code epsg of output Data")
|
|
36
|
+
return parser
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def process_args_proj_param(args: argparse, work: Worksite) -> Worksite:
|
|
40
|
+
"""
|
|
41
|
+
Processing args with data.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
args (argparse): Arg to apply on worksite (data).
|
|
45
|
+
work (Worksite): Worksite to work on.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Worksite: data
|
|
49
|
+
"""
|
|
50
|
+
# Add a projection to the worksite
|
|
51
|
+
if args.epsg is not None:
|
|
52
|
+
work.set_proj([args.epsg, args.geog, args.geoc], args.pathgeoid, args.oe)
|
|
53
|
+
print(f"Projection set-up with EPSG:{args.epsg}.")
|
|
54
|
+
else:
|
|
55
|
+
print("There is no given projection.")
|
|
56
|
+
|
|
57
|
+
return work
|
|
@@ -36,13 +36,13 @@ def args_output_shot(parser: argparse) -> argparse:
|
|
|
36
36
|
Returns:
|
|
37
37
|
argsparse: Parser with argument.
|
|
38
38
|
"""
|
|
39
|
-
parser.add_argument('
|
|
39
|
+
parser.add_argument('--ob', '--order_axe_output',
|
|
40
40
|
type=str, default=None,
|
|
41
41
|
help="Order of rotation matrix axes you want in output.")
|
|
42
|
-
parser.add_argument('
|
|
42
|
+
parser.add_argument('--ou', '--output_unit_angle',
|
|
43
43
|
type=str, default=None, choices=["degree", "radian", None],
|
|
44
44
|
help="Unit of the angle of shooting, 'degree' or 'radian'")
|
|
45
|
-
parser.add_argument('
|
|
45
|
+
parser.add_argument('--oa', '--output_linear_alteration',
|
|
46
46
|
type=bool, default=None,
|
|
47
47
|
help="True if z shot corrected by linear alteration.")
|
|
48
48
|
return parser
|
|
@@ -45,8 +45,8 @@ def process_args_write_opk(args: argparse, work: Worksite) -> None:
|
|
|
45
45
|
args (argparse): Arg to apply on worksite (data).
|
|
46
46
|
work (Worksite): Data.
|
|
47
47
|
"""
|
|
48
|
-
if args.
|
|
49
|
-
args.
|
|
48
|
+
if args.ob:
|
|
49
|
+
args.ob = args.ob.lower()
|
|
50
50
|
|
|
51
51
|
if args.output_header:
|
|
52
52
|
args.output_header = list(args.output_header.upper())
|
|
@@ -54,10 +54,10 @@ def process_args_write_opk(args: argparse, work: Worksite) -> None:
|
|
|
54
54
|
# Writing data
|
|
55
55
|
print("Writing OPK.")
|
|
56
56
|
if args.namereturn is not None:
|
|
57
|
-
args_writing = {"order_axe": args.
|
|
57
|
+
args_writing = {"order_axe": args.ob,
|
|
58
58
|
"header": args.output_header,
|
|
59
|
-
"unit_angle": args.
|
|
60
|
-
"linear_alteration": args.
|
|
59
|
+
"unit_angle": args.ou,
|
|
60
|
+
"linear_alteration": args.oa}
|
|
61
61
|
manager_writer("opk", args.namereturn, args.pathreturn, args_writing, work)
|
|
62
62
|
print(f"File written in {args.pathreturn + args.namereturn}.opk.")
|
|
63
63
|
else:
|
|
@@ -44,8 +44,8 @@ def process_space_resection(args: argparse) -> Worksite:
|
|
|
44
44
|
work = Worksite("Space_Resection")
|
|
45
45
|
work = process_args_gen_param(args, work)
|
|
46
46
|
work.set_type_z_shot(check_header_file(list(args.output_header.upper()))[1])
|
|
47
|
-
pt2d = read_file_pt_dataframe(args.gcp2d, list(args.head_gcp2d.upper()), "pt2d")
|
|
48
|
-
pt3d = read_file_pt_dataframe(args.gcp3d, list(args.head_gcp3d.upper()), "pt3d")
|
|
47
|
+
pt2d, _ = read_file_pt_dataframe(args.gcp2d, list(args.head_gcp2d.upper()), "pt2d")
|
|
48
|
+
pt3d, _ = read_file_pt_dataframe(args.gcp3d, list(args.head_gcp3d.upper()), "pt3d")
|
|
49
49
|
pinit = {"coor_init": np.array(args.point3d)}
|
|
50
50
|
SpaceResection(work).space_resection_to_worksite(pt2d, pt3d, pinit)
|
|
51
51
|
return work
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Args of parser to transform projection of 3D points.
|
|
3
|
+
"""
|
|
4
|
+
import argparse
|
|
5
|
+
|
|
6
|
+
from borea.process.p_add_data.p_file_gcp3d import args_gcp3d
|
|
7
|
+
from borea.process.p_add_data.p_proj import args_proj_param
|
|
8
|
+
from borea.process.p_add_data.p_write import args_writer
|
|
9
|
+
from borea.reader.reader_point import read_file_pt_dataframe
|
|
10
|
+
from borea.geodesy.proj_engine import ProjEngine
|
|
11
|
+
from borea.writer.writer_df_to_txt import write_df_to_txt
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def args_tf_proj_param(parser: argparse) -> argparse:
|
|
15
|
+
"""
|
|
16
|
+
Args for adding transform proj of points parameter.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
parser (argparse): Parser to add argument.
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
argsparse: Parser with argument.
|
|
23
|
+
"""
|
|
24
|
+
parser = args_gcp3d(parser)
|
|
25
|
+
parser = args_proj_param(parser)
|
|
26
|
+
parser.add_argument('--oz', '--z_output',
|
|
27
|
+
type=str, choices=[None, 'altitude', 'height'], default=None,
|
|
28
|
+
help="Output type of z. altitude or height")
|
|
29
|
+
parser = args_writer(parser)
|
|
30
|
+
return parser
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def process_tf_proj_param(args: argparse) -> None:
|
|
34
|
+
"""
|
|
35
|
+
Processing args with data.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
args (argparse): Arg to apply on worksite (data).
|
|
39
|
+
"""
|
|
40
|
+
# Read file to Dataframe
|
|
41
|
+
df, type_z = read_file_pt_dataframe(args.gcp3d, args.head_gcp3d, "pt3d")
|
|
42
|
+
|
|
43
|
+
# Setup Projection
|
|
44
|
+
ProjEngine().set_epsg([args.epsg, args.geog, args.geoc], args.pathgeoid, args.oe)
|
|
45
|
+
|
|
46
|
+
# Change projection
|
|
47
|
+
new_df = ProjEngine().tf.transform_pt_proj(df, type_z, args.oz)
|
|
48
|
+
|
|
49
|
+
# Write the new file
|
|
50
|
+
write_df_to_txt(args.namereturn, args.pathreturn, new_df)
|
|
@@ -50,9 +50,9 @@ def read(file: Path, args: dict, work: Worksite) -> Worksite:
|
|
|
50
50
|
file_opk.close()
|
|
51
51
|
except FileNotFoundError as e:
|
|
52
52
|
raise FileNotFoundError(f"The path {file} is incorrect !!! "
|
|
53
|
-
f"or your os is {platform.system()}."
|
|
54
|
-
"For Windows path is \\,"
|
|
55
|
-
"
|
|
53
|
+
f"or your os is {platform.system()}. "
|
|
54
|
+
"For Windows path is \\, "
|
|
55
|
+
"for Linux and MacOS (Darwin) is / .") from e
|
|
56
56
|
|
|
57
57
|
work.type_z_shot = type_z
|
|
58
58
|
return work
|
borea/reader/reader_point.py
CHANGED
|
@@ -53,7 +53,7 @@ def read_file_pt(path: str, header: list, type_point: str, work: Worksite) -> No
|
|
|
53
53
|
raise FileNotFoundError(f"The path {path} is incorrect !!!") from e
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
def read_file_pt_dataframe(path: str, header: list, type_point: str) ->
|
|
56
|
+
def read_file_pt_dataframe(path: str, header: list, type_point: str) -> tuple:
|
|
57
57
|
"""
|
|
58
58
|
Read file of points to save in Dataframe.
|
|
59
59
|
|
|
@@ -63,12 +63,12 @@ def read_file_pt_dataframe(path: str, header: list, type_point: str) -> pd.DataF
|
|
|
63
63
|
type_point (str): Type of point is reading (pt2d, pt3d).
|
|
64
64
|
|
|
65
65
|
Returns:
|
|
66
|
-
|
|
66
|
+
tuple: Dataframe of data and type of z in str.
|
|
67
67
|
"""
|
|
68
68
|
if type_point not in ["pt2d", "pt3d"]:
|
|
69
69
|
raise ValueError(f"type {type_point} in incorrect. ['pt2d', 'pt3d']")
|
|
70
70
|
|
|
71
|
-
header,
|
|
71
|
+
header, type_z = check_header_file(header, type_point)
|
|
72
72
|
|
|
73
73
|
id_pt = []
|
|
74
74
|
ttype = []
|
|
@@ -110,4 +110,4 @@ def read_file_pt_dataframe(path: str, header: list, type_point: str) -> pd.DataF
|
|
|
110
110
|
"id_shot": ttype,
|
|
111
111
|
"column": coor[:, 0],
|
|
112
112
|
"line": coor[:, 1]})
|
|
113
|
-
return df
|
|
113
|
+
return df, type_z
|
|
@@ -28,9 +28,9 @@ def conv_z_shot_to_z_data(shot: Shot, type_z_shot: str, type_z_data: str,
|
|
|
28
28
|
|
|
29
29
|
if type_z_shot != type_z_data:
|
|
30
30
|
if type_z_shot == "height":
|
|
31
|
-
new_z = ProjEngine().tranform_altitude(pos_shot)
|
|
31
|
+
new_z = ProjEngine().tf.tranform_altitude(pos_shot)
|
|
32
32
|
else:
|
|
33
|
-
new_z = ProjEngine().tranform_height(pos_shot)
|
|
33
|
+
new_z = ProjEngine().tf.tranform_height(pos_shot)
|
|
34
34
|
pos_shot[2] = new_z
|
|
35
35
|
|
|
36
36
|
return pos_shot
|
|
@@ -51,8 +51,8 @@ def conv_output_z_type(coor: np.ndarray, type_z_input: str, type_z_output: str)
|
|
|
51
51
|
new_z = coor[2]
|
|
52
52
|
if type_z_input != type_z_output:
|
|
53
53
|
if type_z_input == "height":
|
|
54
|
-
new_z = ProjEngine().tranform_altitude(coor)
|
|
54
|
+
new_z = ProjEngine().tf.tranform_altitude(coor)
|
|
55
55
|
else:
|
|
56
|
-
new_z = ProjEngine().tranform_height(coor)
|
|
56
|
+
new_z = ProjEngine().tf.tranform_height(coor)
|
|
57
57
|
|
|
58
58
|
return np.array([coor[0], coor[1], new_z])
|
|
@@ -37,7 +37,7 @@ class ImageWorldShot():
|
|
|
37
37
|
Returns:
|
|
38
38
|
np.array: Cartographique coordinate [x,y,z].
|
|
39
39
|
"""
|
|
40
|
-
if type_z_data != type_z_shot and not ProjEngine().geog_to_geoid:
|
|
40
|
+
if type_z_data != type_z_shot and not ProjEngine().tf.geog_to_geoid:
|
|
41
41
|
raise ValueError("Missing geoid")
|
|
42
42
|
|
|
43
43
|
if not Dtm().path_dtm:
|
|
@@ -34,7 +34,7 @@ class WorldImageShot():
|
|
|
34
34
|
Returns:
|
|
35
35
|
np.array: The image coordinate [c,l].
|
|
36
36
|
"""
|
|
37
|
-
if type_z_data != type_z_shot and not ProjEngine().geog_to_geoid:
|
|
37
|
+
if type_z_data != type_z_shot and not ProjEngine().tf.geog_to_geoid:
|
|
38
38
|
raise ValueError("Missing geoid")
|
|
39
39
|
|
|
40
40
|
if self.shot.linear_alteration and not Dtm().path_dtm and not self.shot.approxeucli:
|
|
@@ -150,7 +150,7 @@ class WorldLeastSquare:
|
|
|
150
150
|
"""
|
|
151
151
|
v_res = np.zeros(nbr_obs)
|
|
152
152
|
coord_i, coord_j, data = [], [], []
|
|
153
|
-
for
|
|
153
|
+
for id_shot, pd_data in pd_mes_temp.groupby('id_img'):
|
|
154
154
|
shot = self.work.shots[id_shot]
|
|
155
155
|
cam = self.work.cameras[shot.name_cam]
|
|
156
156
|
|
borea/worksite/worksite.py
CHANGED
|
@@ -173,8 +173,10 @@ class Worksite(Workdata):
|
|
|
173
173
|
self.type_z_shot, False)[2]
|
|
174
174
|
shot.set_z_nadir(z_nadir)
|
|
175
175
|
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
# pylint: disable-next=too-many-arguments too-many-positional-arguments
|
|
177
|
+
def set_unit_output(self, type_z: str = None, unit_angle: str = None,
|
|
178
|
+
linear_alteration: bool = None, order_axe: str = None,
|
|
179
|
+
proj_output: bool = True) -> None:
|
|
178
180
|
"""
|
|
179
181
|
Allows you to change unit or parameter of shots.
|
|
180
182
|
|
|
@@ -183,6 +185,7 @@ class Worksite(Workdata):
|
|
|
183
185
|
unit_angle (str): Unit angle you want.
|
|
184
186
|
linear_alteration (bool): True if you want data corrected.
|
|
185
187
|
order_axe (str): Order of rotation matrice you want in your angle.
|
|
188
|
+
proj_output (bool): True to change the projection of shot.
|
|
186
189
|
"""
|
|
187
190
|
if unit_angle not in ["degree", "radian", None]:
|
|
188
191
|
raise ValueError(f"unit_angle: {unit_angle} is not recognized,"
|
|
@@ -198,14 +201,16 @@ class Worksite(Workdata):
|
|
|
198
201
|
self.type_z_shot = type_z
|
|
199
202
|
|
|
200
203
|
for shot in self.shots.values():
|
|
201
|
-
if unit_angle
|
|
204
|
+
if unit_angle:
|
|
202
205
|
shot.set_unit_angle(unit_angle)
|
|
203
|
-
if type_z
|
|
206
|
+
if type_z:
|
|
204
207
|
shot.set_type_z(type_z)
|
|
205
208
|
if linear_alteration is not None:
|
|
206
209
|
shot.set_linear_alteration(linear_alteration)
|
|
207
|
-
if order_axe
|
|
210
|
+
if order_axe:
|
|
208
211
|
shot.set_order_axe(order_axe)
|
|
212
|
+
if self.epsg_output and proj_output:
|
|
213
|
+
shot.set_proj_pos()
|
|
209
214
|
|
|
210
215
|
def calculate_barycentre(self) -> np.ndarray:
|
|
211
216
|
"""
|
borea/writer/writer_con.py
CHANGED
|
@@ -20,7 +20,14 @@ def write(name: str, folder_con: str, param_con: dict, work: Worksite) -> None:
|
|
|
20
20
|
work (Worksite): The site to be recorded.
|
|
21
21
|
"""
|
|
22
22
|
_, _ = name, param_con
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
if work.epsg_output:
|
|
25
|
+
epsg_output = ProjEngine().epsg_output
|
|
26
|
+
else:
|
|
27
|
+
epsg_output = ProjEngine().epsg[0]
|
|
28
|
+
|
|
29
|
+
work.set_unit_output(type_z="altitude", linear_alteration=True)
|
|
30
|
+
geoview_proj = search_info("EPSG", str(epsg_output), "GEOVIEW")
|
|
24
31
|
|
|
25
32
|
for name_shot, shot in work.shots.items():
|
|
26
33
|
cam = work.cameras[shot.name_cam]
|
borea/writer/writer_opk.py
CHANGED
|
@@ -35,7 +35,7 @@ def write(name_opk: str, path_opk: str, args: dict, work: Worksite) -> None:
|
|
|
35
35
|
if "S" in header:
|
|
36
36
|
raise ValueError("Letter S doesn't existe in writing header opk.")
|
|
37
37
|
|
|
38
|
-
work.
|
|
38
|
+
work.set_unit_output(type_z, args["unit_angle"], args["linear_alteration"], args["order_axe"])
|
|
39
39
|
|
|
40
40
|
header_file = ""
|
|
41
41
|
for i in header:
|
borea/writer/writer_rpc.py
CHANGED
|
@@ -20,6 +20,7 @@ def write(name: str, folder_rpc: str, param_rpc: dict, work: Worksite) -> None:
|
|
|
20
20
|
"size_grid"; size of the grip to calcule rpc.
|
|
21
21
|
"order"; order of the polynome of the rpc.
|
|
22
22
|
"fact_rpc"; rpc factor for world coordinate when src is not WGS84.
|
|
23
|
+
"epsg_output"; code epsg for RPC.
|
|
23
24
|
work (Worksite): The site to be recorded.
|
|
24
25
|
"""
|
|
25
26
|
_ = name
|
|
@@ -28,7 +29,9 @@ def write(name: str, folder_rpc: str, param_rpc: dict, work: Worksite) -> None:
|
|
|
28
29
|
"SAMP_SCALE", "LAT_SCALE", "LONG_SCALE",
|
|
29
30
|
"HEIGHT_SCALE"]
|
|
30
31
|
|
|
31
|
-
work.
|
|
32
|
+
param_rpc["epsg_output"] = work.epsg_output
|
|
33
|
+
|
|
34
|
+
work.set_unit_output(type_z=Dtm().type_dtm, proj_output=False)
|
|
32
35
|
|
|
33
36
|
for name_shot, shot in work.shots.items():
|
|
34
37
|
cam = work.cameras[shot.name_cam]
|
|
@@ -13,8 +13,8 @@ from borea.process.p_format.p_write_opk import args_writing_opk, process_args_wr
|
|
|
13
13
|
|
|
14
14
|
def spaceresection_opk():
|
|
15
15
|
"""
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
Produces an OPK file from image link points and their field coordinates
|
|
17
|
+
coordinates (calculates the 6 external parameters for each image with a point)
|
|
18
18
|
"""
|
|
19
19
|
parser = argparse.ArgumentParser(description='Space resection of point file image and world'
|
|
20
20
|
' to calculate 6 externals parameters of shots')
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Main to transform projection of 3D points.
|
|
3
|
+
"""
|
|
4
|
+
# pylint: disable=import-error, wrong-import-position, line-too-long
|
|
5
|
+
import argparse
|
|
6
|
+
import sys
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
|
|
10
|
+
from borea.process.p_func.p_tf_proj_pt import args_tf_proj_param, process_tf_proj_param # noqa: E402, E501
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def transform_proj_pt():
|
|
14
|
+
"""
|
|
15
|
+
Transforms the projection of a point file by pyproj.
|
|
16
|
+
"""
|
|
17
|
+
parser = argparse.ArgumentParser(description='Transform coordinate projection of the 3D points'
|
|
18
|
+
' file.')
|
|
19
|
+
|
|
20
|
+
# Args
|
|
21
|
+
parser = args_tf_proj_param(parser)
|
|
22
|
+
|
|
23
|
+
args = parser.parse_args()
|
|
24
|
+
|
|
25
|
+
# Process data
|
|
26
|
+
process_tf_proj_param(args)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
if __name__ == "__main__":
|
|
30
|
+
transform_proj_pt()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: ign-borea
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: A package to manipulate orientation files
|
|
5
5
|
Author-email: Antoine Cornu <antoine.cornu@ign.fr>, Nicolas Laurain <nicolas.laurain@ign.fr>
|
|
6
6
|
License: MIT License
|
|
@@ -53,8 +53,6 @@ Requires-Dist: dataclasses ; extra == 'dev'
|
|
|
53
53
|
Requires-Dist: pyproj ; extra == 'dev'
|
|
54
54
|
Requires-Dist: scipy ; extra == 'dev'
|
|
55
55
|
Requires-Dist: pandas ; extra == 'dev'
|
|
56
|
-
Requires-Dist: build ; extra == 'dev'
|
|
57
|
-
Requires-Dist: twine ; extra == 'dev'
|
|
58
56
|
|
|
59
57
|
[](https://www.ign.fr/) [](
|
|
60
58
|
https://pypi.org/project/ign-borea/)
|
|
@@ -101,6 +99,7 @@ Some tools are already implemented in the library:
|
|
|
101
99
|
* Transforms coordinates file terrain from image: `ptfile-image-to-world -h` [doc](https://github.com/IGNF/Borea/tree/main/borea_tools/docs_tools/README_ptfile_image_to_world.md)
|
|
102
100
|
* Transforms coordinates file image from terrain: `ptfile-world-to-image -h` [doc](https://github.com/IGNF/Borea/tree/main/borea_tools/docs_tools/README_ptfile_world_to_image.md)
|
|
103
101
|
* Calculates opk by space resection: `spaceresection-opk -h` [doc](https://github.com/IGNF/Borea/tree/main/borea_tools/docs_tools/README_spaceresection_opk.md)
|
|
102
|
+
* Transform projection of points file: `transform-proj-points -h` [doc](./borea_tools/docs_tools/README_transform_proj_points.md)
|
|
104
103
|
|
|
105
104
|
## Read data and instantiate worksite
|
|
106
105
|
|
|
@@ -3,17 +3,17 @@ borea/datastruct/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
|
|
|
3
3
|
borea/datastruct/camera.py,sha256=78cOKiqm08HRWFNHFJsL-egiDFxEsB74AtI-BWsFEqQ,660
|
|
4
4
|
borea/datastruct/dtm.py,sha256=qsoH7wJGbolyRIMd7q8FI9Xk-8TwQo9dBvI79lbaJIU,3998
|
|
5
5
|
borea/datastruct/gcp.py,sha256=cXDGPAAIpHWI0Wq8VexAqcodg7GmdtDbVeWXjzOYuAs,544
|
|
6
|
-
borea/datastruct/shot.py,sha256=
|
|
7
|
-
borea/datastruct/workdata.py,sha256=
|
|
6
|
+
borea/datastruct/shot.py,sha256=kYvCSuKRntIMAXaJX75jaMIJJdWEFLAjV-bCWWHWV8g,9160
|
|
7
|
+
borea/datastruct/workdata.py,sha256=xTt-3P1l90q_EPL__TRBFz5zl6U2UXEDPPAct0gRWQ8,8844
|
|
8
8
|
borea/format/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
-
borea/format/conl.py,sha256=
|
|
10
|
-
borea/format/rpc.py,sha256=
|
|
9
|
+
borea/format/conl.py,sha256=mYzDO2A8BoEBMSlok5iUvzoADHMMywgq4iE_l1S_1Jg,4767
|
|
10
|
+
borea/format/rpc.py,sha256=T5IAv6USqb8mdgao427cL1qyvJC5SdHS2H080f7Mbcs,11362
|
|
11
11
|
borea/geodesy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
12
|
borea/geodesy/approx_euclidean_proj.py,sha256=0X3BHKeK0YPBFRjpRkyEtI-unXljzjcXRKGADHAN3dY,3235
|
|
13
13
|
borea/geodesy/euclidean_proj.py,sha256=VSPckwZAvem4z6SQhdacjwC4XbcucNjA6gWEjBVBEJY,684
|
|
14
|
-
borea/geodesy/local_euclidean_proj.py,sha256=
|
|
15
|
-
borea/geodesy/proj_engine.py,sha256=
|
|
16
|
-
borea/geodesy/transform_geodesy.py,sha256=
|
|
14
|
+
borea/geodesy/local_euclidean_proj.py,sha256=iMAL__CwkD26gw8wy5hPJR-FijnK6BUcutgqUAUNXFQ,5378
|
|
15
|
+
borea/geodesy/proj_engine.py,sha256=ORNVC0h5DjCNFEzuRpX2rGAYXuiByqCac3Qc79d8buE,2665
|
|
16
|
+
borea/geodesy/transform_geodesy.py,sha256=MCHPgXt3aTiEkY6SiNY_LeHvyYrdffhSq51xZbgM58o,9298
|
|
17
17
|
borea/geodesy/projectionlist/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
18
|
borea/geodesy/projectionlist/search_proj.py,sha256=Qnu6n8hJxnLi72DY5n2jWMo5p8jU_bENY-hWgHnrlnM,1820
|
|
19
19
|
borea/process/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -21,39 +21,41 @@ borea/process/p_add_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
|
21
21
|
borea/process/p_add_data/p_add_shot.py,sha256=wrjYxJH3bcMfPhQ2ns6jy2uYYXFPnJfTRvDWav1OmqY,1918
|
|
22
22
|
borea/process/p_add_data/p_file_gcp2d.py,sha256=lNYNSck-FIjnQ2AKAFVGvvNLxgcoCB0IJ25uAyAfCGI,1652
|
|
23
23
|
borea/process/p_add_data/p_file_gcp3d.py,sha256=iGcIZU6lCIl0FqR_pE2zDeSbHLqEIvmfnM87A6d4p2k,1632
|
|
24
|
-
borea/process/p_add_data/p_gen_param.py,sha256=
|
|
24
|
+
borea/process/p_add_data/p_gen_param.py,sha256=SwuIASSAyel2G_MkFFRh8VSWj0sspBUtUdr0SKP9XuE,1976
|
|
25
|
+
borea/process/p_add_data/p_proj.py,sha256=PaiyVqcDpAdmHIa7dNetv6oUJ7l607278kGgRlrB7tw,2018
|
|
25
26
|
borea/process/p_add_data/p_pt2d.py,sha256=g0L_fY8dkVbM17-jut75I9FXvUOfnrrlcT5VQu26aUQ,1696
|
|
26
27
|
borea/process/p_add_data/p_pt3d.py,sha256=wAY5o8_i76UG9qwfcseiOI09h0ONiRmvOeimPqtiyTw,1681
|
|
27
|
-
borea/process/p_add_data/p_unit_shot.py,sha256=
|
|
28
|
+
borea/process/p_add_data/p_unit_shot.py,sha256=VkfXhSY9XxOLzOxWJCNyR-10mb8Y2VYbEUIKmNlswbQ,1681
|
|
28
29
|
borea/process/p_add_data/p_write.py,sha256=QULk-09Wj9AZDX_ciJeACdzL2t2VGcZFp4HwnCVSdY0,570
|
|
29
30
|
borea/process/p_format/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
31
|
borea/process/p_format/p_read_opk.py,sha256=okG3inUF0m2u-8Fepvv_bFpXIIEPAvQCISDpqdm7iAc,3178
|
|
31
32
|
borea/process/p_format/p_write_con.py,sha256=u6NjwGOHcfsAA_JZsh_E-5UU_xYvJrr3QyLGNnhmfCQ,977
|
|
32
|
-
borea/process/p_format/p_write_opk.py,sha256=
|
|
33
|
+
borea/process/p_format/p_write_opk.py,sha256=fhBp4Jp9QLK2AsEr9i-zRq_UAfHir7iomaM15p2XDIA,2225
|
|
33
34
|
borea/process/p_format/p_write_rpc.py,sha256=Tzt5DJvetbDpr6DlW9CtqzVAJQtcevBMIPtJ087D6F8,1584
|
|
34
35
|
borea/process/p_func/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
36
|
borea/process/p_func/p_control.py,sha256=A-SqLnePn6jiqQlmDaTdvyVAazHd59LtCN6UQgleiIQ,2440
|
|
36
37
|
borea/process/p_func/p_image_world.py,sha256=gUPdwm-5cNb6RgxGTnxxU8dnGVQHiddXVhqD6xf0b7U,1663
|
|
37
|
-
borea/process/p_func/p_spaceresection.py,sha256
|
|
38
|
+
borea/process/p_func/p_spaceresection.py,sha256=-VPtXXrZ4hfuM0KjLgNtbQn0ZJAbK0w21V0wdTdBLGs,1727
|
|
39
|
+
borea/process/p_func/p_tf_proj_pt.py,sha256=DH8C37IynzaRtOb4I1PnJRrwH4NyNPCKjGN96W0rqj4,1556
|
|
38
40
|
borea/process/p_func/p_world_image.py,sha256=8vD7J93ze305I4zMkzZhUOlFacJRaS9w9ILIUR_44-Y,1569
|
|
39
41
|
borea/reader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
42
|
borea/reader/reader_camera.py,sha256=xBAJTMdXbPZTD_DvH83WEB7Jx808mTu_ZmmdVsrdYck,1606
|
|
41
|
-
borea/reader/reader_point.py,sha256=
|
|
43
|
+
borea/reader/reader_point.py,sha256=aRmvyTYC-McZGKI1NPpHoGcAeHrYCanPdLO1La-3vFI,4473
|
|
42
44
|
borea/reader/orientation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
45
|
borea/reader/orientation/manage_reader.py,sha256=Q7MATjkQtCKdb1vU6FOYXdfoViipakq2Sm30sQcMO7c,986
|
|
44
|
-
borea/reader/orientation/reader_opk.py,sha256=
|
|
46
|
+
borea/reader/orientation/reader_opk.py,sha256=zsNwzPzGOu4aqvrN_Q3yQhrEbyqQcNo92Vp9nfmWQ-c,2799
|
|
45
47
|
borea/stat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
48
|
borea/stat/statistics.py,sha256=846GkzmOwyTUvZInuVk04xFo74I70TWgJ1QShoXabi0,9434
|
|
47
49
|
borea/transform_world_image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
50
|
borea/transform_world_image/transform_dtm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
51
|
borea/transform_world_image/transform_dtm/world_image_dtm.py,sha256=0tRMnFY0eqo8wggOnEd_VANy7g8WIrUZNnhY-RFAJnU,1335
|
|
50
52
|
borea/transform_world_image/transform_shot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
51
|
-
borea/transform_world_image/transform_shot/conversion_coor_shot.py,sha256=
|
|
52
|
-
borea/transform_world_image/transform_shot/image_world_shot.py,sha256=
|
|
53
|
-
borea/transform_world_image/transform_shot/world_image_shot.py,sha256=
|
|
53
|
+
borea/transform_world_image/transform_shot/conversion_coor_shot.py,sha256=7DNOZ7PXk0DMmA3HMoWTms5kmsxlHEHPuFD5rwzOhYo,1876
|
|
54
|
+
borea/transform_world_image/transform_shot/image_world_shot.py,sha256=JF2k9GP6Iz1lnUgwMnGufkz97IQyeAIfYosPx0-_8bw,6006
|
|
55
|
+
borea/transform_world_image/transform_shot/world_image_shot.py,sha256=tSCzLdDo_R31wluetDm3uulv1uCxGAqGxBFyqKGMXS0,4558
|
|
54
56
|
borea/transform_world_image/transform_worksite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
57
|
borea/transform_world_image/transform_worksite/image_world_intersection.py,sha256=EWFy65qcPQ4yG4h_EHrQvk6aWFuB9ukpm2kgiOveGC8,6440
|
|
56
|
-
borea/transform_world_image/transform_worksite/image_world_least_square.py,sha256=
|
|
58
|
+
borea/transform_world_image/transform_worksite/image_world_least_square.py,sha256=9APLwtmRE6D3F_RZr_nK7bdxg6LwfzEiUYgefgSap5I,7926
|
|
57
59
|
borea/transform_world_image/transform_worksite/image_world_work.py,sha256=bK6IoffN_lnVfwFHUBKBA8A5blBNeWzT7voatVtfLaA,2037
|
|
58
60
|
borea/transform_world_image/transform_worksite/space_resection.py,sha256=bdhDz9zNISdfGm2JQRE2khghPE4DAXj-i3f8pCzQ6ss,14595
|
|
59
61
|
borea/transform_world_image/transform_worksite/world_image_work.py,sha256=2bHIIINEumFD1GvU2bdOi8V9bTvMCBKwCIzxFNR796c,1721
|
|
@@ -73,13 +75,13 @@ borea/utils/singleton/singleton.py,sha256=nTPEI033sYMmVDHBfLgcHdpBFmkU-gidpKPrmQ
|
|
|
73
75
|
borea/utils/xml/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
74
76
|
borea/utils/xml/xml.py,sha256=zHW8p1HmSVp_L-Yu0SGqsTHrJptnG3LdARyjUDxHUpY,1671
|
|
75
77
|
borea/worksite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
76
|
-
borea/worksite/worksite.py,sha256=
|
|
78
|
+
borea/worksite/worksite.py,sha256=8sEhjWQRaU8rkMwzRo5WDeqUzVmN0xWnxDW7GizFzFU,9364
|
|
77
79
|
borea/writer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
78
80
|
borea/writer/manage_writer.py,sha256=ukOHO4zfIQG-bJoi_rw85LIAjIsfcI1lJIQi9b2CTcs,799
|
|
79
|
-
borea/writer/writer_con.py,sha256=
|
|
81
|
+
borea/writer/writer_con.py,sha256=hm2ewKLP4-B0abg6Q6Mq_5ktuwQwaveGB2sazKG5Jqs,1189
|
|
80
82
|
borea/writer/writer_df_to_txt.py,sha256=kr5DXbOGEqhoonYf9rQqQkku5k0nAenNoC3zE0pZDYQ,938
|
|
81
|
-
borea/writer/writer_opk.py,sha256=
|
|
82
|
-
borea/writer/writer_rpc.py,sha256=
|
|
83
|
+
borea/writer/writer_opk.py,sha256=WLy4uxaXiHtKACteieZm9QifBMjZki1z9bxlhV1RFAE,2652
|
|
84
|
+
borea/writer/writer_rpc.py,sha256=13M0zPvVCGG8HpiYDYYKzUq_jQGVG8yuChO43e2-TYU,2228
|
|
83
85
|
borea_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
84
86
|
borea_tools/opk_control.py,sha256=jU6CitB1WzmKc_uT5GbdmXeYlHwvtnzKD7gcNv_XKTY,907
|
|
85
87
|
borea_tools/opk_to_conl.py,sha256=iX7f1f6KR-cVQxMYimfKmZVtUnuYFRpmUDH1bzZFZjQ,1054
|
|
@@ -89,10 +91,11 @@ borea_tools/pt_image_to_world.py,sha256=6_7ShQNu-FmNKNZHKdktXQJkNyxZGA2luF9zZYx6
|
|
|
89
91
|
borea_tools/pt_world_to_image.py,sha256=4WV19794N3fNhz5P32Bl8Fc1nczJqpQdY_IITV20kqs,948
|
|
90
92
|
borea_tools/ptfile_image_to_world.py,sha256=F4rpSexO_2lSFOVQ5WjajhhmfS71x4_3HLDL7clEKzs,984
|
|
91
93
|
borea_tools/ptfile_world_to_image.py,sha256=NkAmhppWW_boXIhKue5aoNCLnrhv8G2IwVqJJto-8MM,984
|
|
92
|
-
borea_tools/spaceresection_opk.py,sha256=
|
|
93
|
-
|
|
94
|
-
ign_borea-0.1.
|
|
95
|
-
ign_borea-0.1.
|
|
96
|
-
ign_borea-0.1.
|
|
97
|
-
ign_borea-0.1.
|
|
98
|
-
ign_borea-0.1.
|
|
94
|
+
borea_tools/spaceresection_opk.py,sha256=xZeLZnSLFBP2BCKT_ere8r0mjvfIkr9GkU7HG3hWCUo,1240
|
|
95
|
+
borea_tools/transform_proj_points.py,sha256=oFBLrV0xZKqmuNsGwUsnfN3ODnzXXOpbLCM-PggURbM,792
|
|
96
|
+
ign_borea-0.2.1.dist-info/LICENSE,sha256=dYSQkCbiWEky0zxQDlv5bJoETo6HWl5bLK1YZ3EjaUc,1120
|
|
97
|
+
ign_borea-0.2.1.dist-info/METADATA,sha256=kgup0xHOgTeYQNdX63pMfTAfV748Qr3qi5PkdINy-CI,17115
|
|
98
|
+
ign_borea-0.2.1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
99
|
+
ign_borea-0.2.1.dist-info/entry_points.txt,sha256=b6glLVH7i9ZDczq9jixxTcm3eBtd-hhQk8CB6wMgK2c,655
|
|
100
|
+
ign_borea-0.2.1.dist-info/top_level.txt,sha256=lJfyWpWFfy0625vF49vsPvf7TBTZa3CExzPW5Iormno,18
|
|
101
|
+
ign_borea-0.2.1.dist-info/RECORD,,
|
|
@@ -8,3 +8,4 @@ pt-world-to-image = borea_tools.pt_world_to_image:pt_world_to_image
|
|
|
8
8
|
ptfile-image-to-world = borea_tools.ptfile_image_to_world:ptfile_image_to_world
|
|
9
9
|
ptfile-world-to-image = borea_tools.ptfile_world_to_image:ptfile_world_to_image
|
|
10
10
|
spaceresection-opk = borea_tools.spaceresection_opk:spaceresection_opk
|
|
11
|
+
transform-proj-points = borea_tools.transform_proj_points:transform_proj_pt
|
|
File without changes
|
|
File without changes
|