diff --git a/src/transformez/api.py b/src/transformez/api.py index c8aadfa..3fb98d3 100644 --- a/src/transformez/api.py +++ b/src/transformez/api.py @@ -237,10 +237,7 @@ def build_components( ) if source.horizontal is not None: - vertical = vertical.reproject( - source.horizontal, - dst_region=region_obj, - ) + vertical = vertical.reproject(source.horizontal) return TransformationComponents( horizontal=horizontal, diff --git a/src/transformez/cli/info.py b/src/transformez/cli/info.py index 5fb1564..9afe988 100644 --- a/src/transformez/cli/info.py +++ b/src/transformez/cli/info.py @@ -64,66 +64,108 @@ def reference(ref_id) -> None: parsed_ref = parse_reference(ref_id) if parsed_ref is not None: + parsed_horizontal = parsed_ref.horizontal parsed_vertical = parsed_ref.vertical click.secho("\n Reference:", fg="cyan", bold=True) click.echo("-" * 12) + click.echo(f" {'Input:':<18} {parsed_ref.source_text}") - click.echo(f" {'ID:':<18} {parsed_ref.source_text}") + if parsed_horizontal is not None: + click.secho("\n Horizontal:", fg="cyan", bold=True) + click.echo("-" * 12) - if parsed_vertical is not None: - click.echo(f" {'Name:':<18} {parsed_vertical.name}") - click.echo(f" {'Kind:':<18} {parsed_vertical.kind}") - click.echo( - f" {'Axis Direction:':<18} {parsed_vertical.axis_direction}" + auth = parsed_horizontal.to_authority() + horizontal_id = ( + f"{auth[0]}:{auth[1]}" + if auth is not None + else parsed_horizontal.to_string() ) - click.echo(f" {'Units:':<18} {parsed_vertical.unit_name}") - - resolved_ref = resolve_reference(parsed_ref) - resolved_vertical = resolved_ref.vertical - if resolved_vertical is not None: - resolved_binding = resolved_vertical.binding - if resolved_binding is not None: - click.secho("\n Execution:", fg="cyan", bold=True) - click.echo("-" * 12) - - click.echo(f" {'Engine:':<18} {resolved_binding.engine}") - click.echo(f" {'Provider:':<18} {resolved_binding.provider}") - click.echo( - f" {'Provider Datum:':<18} {resolved_binding.provider_datum}" - ) - click.echo( - f" {'Native Frame:':<18} {resolved_binding.native_frame}" - ) - click.echo( - f" {'Default Model:':<18} {resolved_binding.default_model}" - ) - click.echo( - f" {'Global Proxy:':<18} {resolved_binding.global_proxy}" - ) + + if parsed_horizontal.is_projected: + horizontal_type = "projected" + elif parsed_horizontal.is_geographic: + horizontal_type = "geographic" + else: + horizontal_type = "other" + + click.echo(f" {'ID:':<18} {horizontal_id}") + click.echo(f" {'Name:':<18} {parsed_horizontal.name}") + click.echo(f" {'Type:':<18} {horizontal_type}") + + if parsed_vertical is not None: + click.secho("\n Vertical:", fg="cyan", bold=True) + click.echo("-" * 12) + + click.echo(f" {'ID:':<18} {parsed_vertical.id}") + click.echo(f" {'Name:':<18} {parsed_vertical.name}") + click.echo(f" {'Kind:':<18} {parsed_vertical.kind.value}") + click.echo( + f" {'Axis Direction:':<18} {parsed_vertical.axis_direction.value}" + ) + click.echo(f" {'Units:':<18} {parsed_vertical.unit_name}") + + resolved_ref = resolve_reference(parsed_ref) + resolved_vertical = resolved_ref.vertical + + if resolved_vertical is not None: + resolved_binding = resolved_vertical.binding + + if resolved_binding is not None: + click.secho("\n Execution:", fg="cyan", bold=True) + click.echo("-" * 12) + + click.echo(f" {'Engine:':<18} {resolved_binding.engine}") + click.echo( + f" {'Provider:':<18} {resolved_binding.provider}" + ) + click.echo( + f" {'Provider Datum:':<18} " + f"{resolved_binding.provider_datum}" + ) + click.echo( + f" {'Native Frame:':<18} " + f"{resolved_binding.native_frame}" + ) + click.echo( + f" {'Default Model:':<18} " + f"{resolved_binding.default_model}" + ) + click.echo( + f" {'Global Proxy:':<18} " + f"{resolved_binding.global_proxy}" + ) resolved_frame_binding = resolved_vertical.frame_binding + if resolved_frame_binding is not None: click.secho("\n Frame:", fg="cyan", bold=True) click.echo("-" * 12) + frame_auth = resolved_vertical.native_frame.to_authority() + frame_id = ( + f"{frame_auth[0]}:{frame_auth[1]}" + if frame_auth is not None + else resolved_vertical.native_frame.to_string() + ) + + click.echo(f" {'ID:':<18} {frame_id}") click.echo(f" {'Name:':<18} {resolved_frame_binding.name}") click.echo( f" {'HTDP ID:':<18} {resolved_frame_binding.htdp_id}" ) click.echo( - f" {'Reference Epoch:':<18} {resolved_frame_binding.reference_epoch}" + f" {'Reference Epoch:':<18} " + f"{resolved_frame_binding.reference_epoch}" ) - else: - click.echo(f" No frame binding available for {ref_id}") - else: - click.echo(f" No operation binding available for {ref_id}") - else: - click.echo(f" No vertical reference available for {ref_id}") - else: - click.echo(f" No vertical reference available for {ref_id}") - else: - click.echo(f" Could not parse {ref_id}") + elif resolved_binding is not None: + click.echo( + f" No frame binding available for " + f"{resolved_vertical.native_frame.to_string()}" + ) + + elif parsed_horizontal is None: + click.echo(f" No coordinate reference available for {ref_id}") except InvalidReferenceError: click.echo(f" {ref_id} is unsupported by transformez") diff --git a/src/transformez/integrations/qgis/transformez_qgis/tasks.py b/src/transformez/integrations/qgis/transformez_qgis/tasks.py index ef3e31f..974602b 100644 --- a/src/transformez/integrations/qgis/transformez_qgis/tasks.py +++ b/src/transformez/integrations/qgis/transformez_qgis/tasks.py @@ -232,7 +232,7 @@ def run(self) -> bool: class UninstallTransformezTask(TransformezTask): """Uninstall Transformez from the managed isolated runtime.""" - def __init__(self): + def __init__(self) -> None: super().__init__("Uninstall Transformez from isolated runtime") self.result: subprocess.CompletedProcess[str] | None = None diff --git a/src/transformez/reference/resolver.py b/src/transformez/reference/resolver.py index 29c7f89..55b00b2 100644 --- a/src/transformez/reference/resolver.py +++ b/src/transformez/reference/resolver.py @@ -52,6 +52,13 @@ def resolve_reference( ) native_frame = parsed.vertical.crs + if native_frame.is_projected: + if native_frame.geodetic_crs is not None: + native_frame = native_frame.geodetic_crs + + if native_frame is not None and len(native_frame.axis_info) != 3: + native_frame = native_frame.to_3d() + effective_model = None elif binding is not None: diff --git a/src/transformez/utils.py b/src/transformez/utils.py index 3b76bbb..1b33c01 100644 --- a/src/transformez/utils.py +++ b/src/transformez/utils.py @@ -118,6 +118,7 @@ def __init__(self, filename: str | Path, default_nodata: float = 0.0): with rasterio.open(filename) as src: self.data = src.read(1) + self.crs = src.crs self.transform = src.transform self.inv_transform = ~src.transform self.bounds = src.bounds @@ -142,10 +143,11 @@ def query(self, x: np.ndarray, y: np.ndarray) -> np.ndarray: q_x = np.asarray(x).copy() q_y = np.asarray(y) - if self.bounds.left < 0 and np.any(q_x > 180): - q_x = np.where(q_x > 180, q_x - 360, q_x) - elif self.bounds.left >= 0 and np.any(q_x < 0): - q_x = np.where(q_x < 0, q_x + 360, q_x) + if self.crs is not None and self.crs.is_geographic: + if self.bounds.left < 0 and np.any(q_x > 180): + q_x = np.where(q_x > 180, q_x - 360, q_x) + elif self.bounds.left >= 0 and np.any(q_x < 0): + q_x = np.where(q_x < 0, q_x + 360, q_x) cols_f, rows_f = self.inv_transform * (q_x, q_y) diff --git a/tests/test_components.py b/tests/test_components.py index a0a08bd..e68a2be 100644 --- a/tests/test_components.py +++ b/tests/test_components.py @@ -100,7 +100,7 @@ def test_build_components_vertical_is_aligned_to_source_crs(monkeypatch): args, kwargs = generated.reproject.call_args assert CRS.from_user_input(args[0]) == CRS.from_epsg(32610) - assert kwargs["dst_region"] is region + # assert kwargs["dst_region"] is region # we removed dst_region from build_components # Removing this test for now; i don't think we should crash here when