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.
Files changed (31) hide show
  1. borea/datastruct/shot.py +9 -3
  2. borea/datastruct/workdata.py +19 -12
  3. borea/format/conl.py +1 -5
  4. borea/format/rpc.py +10 -3
  5. borea/geodesy/local_euclidean_proj.py +9 -9
  6. borea/geodesy/proj_engine.py +10 -7
  7. borea/geodesy/transform_geodesy.py +171 -45
  8. borea/process/p_add_data/p_gen_param.py +3 -14
  9. borea/process/p_add_data/p_proj.py +57 -0
  10. borea/process/p_add_data/p_unit_shot.py +3 -3
  11. borea/process/p_format/p_write_opk.py +5 -5
  12. borea/process/p_func/p_spaceresection.py +2 -2
  13. borea/process/p_func/p_tf_proj_pt.py +50 -0
  14. borea/reader/orientation/reader_opk.py +3 -3
  15. borea/reader/reader_point.py +4 -4
  16. borea/transform_world_image/transform_shot/conversion_coor_shot.py +4 -4
  17. borea/transform_world_image/transform_shot/image_world_shot.py +1 -1
  18. borea/transform_world_image/transform_shot/world_image_shot.py +1 -1
  19. borea/transform_world_image/transform_worksite/image_world_least_square.py +1 -1
  20. borea/worksite/worksite.py +10 -5
  21. borea/writer/writer_con.py +8 -1
  22. borea/writer/writer_opk.py +1 -1
  23. borea/writer/writer_rpc.py +4 -1
  24. borea_tools/spaceresection_opk.py +2 -2
  25. borea_tools/transform_proj_points.py +30 -0
  26. {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/METADATA +2 -3
  27. {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/RECORD +31 -28
  28. {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/WHEEL +1 -1
  29. {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/entry_points.txt +1 -0
  30. {ign_borea-0.1.5.dist-info → ign_borea-0.2.1.dist-info}/LICENSE +0 -0
  31. {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.
@@ -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: int, path_geoid: list = None) -> None:
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 (int): Code epsg of the porjection ex: 2154.
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
- try: # Check if the epsg exist
72
- crs = CRS.from_epsg(epsg)
73
- del crs
74
- except exceptions.CRSError as e_info:
75
- raise exceptions.CRSError(f"Your EPSG:{epsg} doesn't exist") from e_info
76
-
77
- ProjEngine().set_epsg(epsg, path_geoid)
78
-
79
- # pylint: disable-next=too-many-arguments
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, linalt: bool = True) -> None:
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
- x_geog, y_geog, z_geog = ProjEngine().carto_to_geog(grid_world[0],
111
- grid_world[1],
112
- grid_world[2])
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
- self.pt_central[1],
98
- self.pt_central[2]))
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
- self.pt_central[1],
120
- self.pt_central[2]))
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]])
@@ -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(TransformGeodesy, metaclass=Singleton):
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.__tf_init__(self, self.geoid, self.crs)
26
+ self.tf = TransformGeodesy(self.epsg, self.geoid, self.epsg_output)
26
27
 
27
- def set_epsg(self, epsg: int, geoid: list = None) -> None:
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 (int): Code epsg of the porjection ex: "EPSG:2154".
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=unsubscriptable-object
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
- crs (pyproj): CRS pyproj of the worksite.
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
- carto_to_geoc = None
22
- geoc_to_carto = None
23
- carto_to_geog = None
24
- geog_to_carto = None
25
- geog_to_geoid = None
26
- geoid_to_geog = None
27
-
28
- def __tf_init__(self, geoid: list, crs: pyproj) -> None:
29
- crs_geoc = pyproj.crs.GeocentricCRS(name=crs.name, datum=crs.datum.name)
30
- crs_geog = pyproj.crs.GeographicCRS(name=crs.name, datum=crs.datum.name)
31
- # Transform cartographic coordinates to geographic coordinates
32
- self.carto_to_geog = pyproj.Transformer.from_crs(crs, crs_geog).transform
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
- Args:
48
- geoid (list): List of geoid to use.
34
+ @property
35
+ def carto_to_geog(self) -> pyproj.Transformer:
49
36
  """
50
- try:
51
- # Transform geoide coordinates to geographic coordinates
52
- self.geoid_to_geog = pyproj.Transformer.from_pipeline(f"+proj=vgridshift "
53
- f"+grids={','.join(geoid)} "
54
- "+multiplier=1").transform
55
- # Transform geographic coordinates to geoide coordinates
56
- self.geog_to_geoid = pyproj.Transformer.from_pipeline(f"+proj=vgridshift "
57
- f"+grids={','.join(geoid)} "
58
- "+multiplier=-1").transform
59
- except pyproj.exceptions.ProjError as e:
60
- raise pyproj.exceptions.ProjError(f"{geoid} The name or path of geotif is incorrect or "
61
- "does not exist in "
62
- f"{pyproj.datadir.get_data_dir()}!!!{e}") from e
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.add_argument('-e', '--epsg',
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
- if args.epsg is not None:
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('-ob', '--order_axe_output',
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('-ou', '--output_unit_angle',
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('-oa', '--output_linear_alteration',
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.order_axe_output:
49
- args.order_axe_output = args.order_axe_output.lower()
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.order_axe_output,
57
+ args_writing = {"order_axe": args.ob,
58
58
  "header": args.output_header,
59
- "unit_angle": args.output_unit_angle,
60
- "linear_alteration": args.output_linear_alteration}
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
- " for Linux and MacOS (Darwin) is / .") from e
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
@@ -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) -> pd.DataFrame:
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
- pd.Dataframe: Dataframe of data.
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, _ = check_header_file(header, type_point)
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 _, (id_shot, pd_data) in enumerate(pd_mes_temp.groupby('id_img')):
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
 
@@ -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
- def set_unit_shot(self, type_z: str = None, unit_angle: str = None,
177
- linear_alteration: bool = None, order_axe: str = None) -> None:
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 is not None:
204
+ if unit_angle:
202
205
  shot.set_unit_angle(unit_angle)
203
- if type_z is not None:
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 is not None:
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
  """
@@ -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
- geoview_proj = search_info("EPSG", str(ProjEngine().epsg), "GEOVIEW")
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]
@@ -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.set_unit_shot(type_z, args["unit_angle"], args["linear_alteration"], args["order_axe"])
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:
@@ -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.set_unit_shot(type_z=Dtm().type_dtm)
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
- Permet d'obtenir un fichier OPK à partir de point de liaison sur les images et de leur
17
- coordonnées terrain (calcule les 6 paramètres externes pour chaque image qui dispose d'un point)
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.5
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
  [![IGNF badge](https://img.shields.io/badge/IGNF-8cbd3a)](https://www.ign.fr/) [![PyPI Downloads](https://img.shields.io/pypi/dm/ign-borea.svg?label=PyPI%20downloads)](
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=sQBIjqQvgn-5kT_8XuuB5PyY2fQBQqhtISbsX0Tt44A,8907
7
- borea/datastruct/workdata.py,sha256=N97vsxEVVS9kroIBD9jNx1mSqreKPS077W20BYzAS04,8394
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=jWHrm-8KYuG3YDvKP_fgrr8h9sw0PoHHrReKqS1WZ2U,4949
10
- borea/format/rpc.py,sha256=_NVl9Q3qpqTL17NpBtc8H5tRPx5cZZh6tEywCKzq04E,10939
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=o7G9gEdhUvXNjlVxYrarOT3MfIteDWfUm8Go2oklwZI,5351
15
- borea/geodesy/proj_engine.py,sha256=5Lu3w4c_pscWxFWjPu9xA4PPgKA5aY19JseYfdfsEXs,2484
16
- borea/geodesy/transform_geodesy.py,sha256=alCMCuHmjoe6q59SEvAdZNAWTS6d2DyGCpIeV3IcYFU,4661
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=SlS_Lr7txhOZPDf8oWe6q4SpnEH-7QHWvKOdEEt1pHg,2560
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=ndfpWSZWI1u6ocFXXOgGldXjeK3Ez9Nkj3FXoaqk11s,1678
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=U4tO15piLUl2zuK3FB_uBd1hUsxVEzJjyL1GGZgynKw,2318
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=SBRAn4OGL7gIxYEgwQj1mkgsZtY73yFXWbuSibFiaTg,1721
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=jZXjw-eof25gvlxQKw8Oj34ecL03JpwkcbOVud71MMQ,4453
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=XPeVKK3FktRZX4zINndIeDhRH9gvBhtwfe_lHkAUDYY,2798
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=QKAvdOZeGui_xIwV6-SKuLAHNwVcIOtWvPbsz5Ec-lY,1864
52
- borea/transform_world_image/transform_shot/image_world_shot.py,sha256=AAJQkfcIizFGLVTwPPYwpYt3CmmGFfaTPnIHb1ErGSs,6003
53
- borea/transform_world_image/transform_shot/world_image_shot.py,sha256=eMKL8LIOVZRMirkFc9eaRWIO-UaWQDX0rDS7Xl2yLss,4555
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=4W37TC3O0XKw3LpIjj3IyRYbNOjDq99zntkXbXPbgEs,7942
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=cYuO-BERHyruOwDkkS3Fe4fGlyAkSI_i1YyFH5idPv0,9114
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=lGeZ0hhnRwdDUle0Qp9Ibj6QdQsWXFJm8kqcU33Foko,1000
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=zGeDz7ItMGlCLZp-XPBlH3mkwmfrB3bt2ROH96-BiLc,2650
82
- borea/writer/writer_rpc.py,sha256=qoTu6OKyP0nqMsojAGhuSXrg_HptBUCceIGwzUNzMWY,2116
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=z8t8JmsVT_yxAC3y-6a7VlDnILnQHgpyfKT_H1OhWZI,1276
93
- ign_borea-0.1.5.dist-info/LICENSE,sha256=dYSQkCbiWEky0zxQDlv5bJoETo6HWl5bLK1YZ3EjaUc,1120
94
- ign_borea-0.1.5.dist-info/METADATA,sha256=9B-owvLEemlHjPBaR33jf5A7ZGnKXRrn3ou6BTuGc1s,17061
95
- ign_borea-0.1.5.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
96
- ign_borea-0.1.5.dist-info/entry_points.txt,sha256=RDC7_y9WZW1Oae0JSHSem8k26jforKHSqdXaFsllxnw,579
97
- ign_borea-0.1.5.dist-info/top_level.txt,sha256=lJfyWpWFfy0625vF49vsPvf7TBTZa3CExzPW5Iormno,18
98
- ign_borea-0.1.5.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.1)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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