OpenGeodeWeb-Back 6.16.1__tar.gz → 6.17.0rc1__tar.gz
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.
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/PKG-INFO +1 -1
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/pyproject.toml +2 -1
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/PKG-INFO +1 -1
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +19 -2
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/app.py +6 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/crs/crs_alignment.py +197 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/crs/crs_assignment.py +117 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/crs/crs_functions.py +360 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/geode_objects/crs_coordinates.py +61 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_brep.py +85 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_edged_curve2d.py +17 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_edged_curve3d.py +20 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_point_set2d.py +17 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_point_set3d.py +20 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_section.py +61 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py +20 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py +17 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py +20 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/blueprint_routes.py +0 -20
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/create/__init__.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/edged_curve.json +21 -1
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/edged_curve.py +11 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/point_set.json +21 -1
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/point_set.py +11 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.json +21 -1
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.py +11 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/__init__.py +0 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/blueprint_crs.py +152 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/__init__.py +5 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/active.json +50 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/active.py +42 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/align.json +171 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/align.py +97 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/assign_geographic.json +113 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/assign_geographic.py +69 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/convert_geographic.json +110 -0
- opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/convert_geographic.py +68 -0
- opengeodeweb_back-6.16.1/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json → opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/geographic_list.json +1 -1
- opengeodeweb_back-6.16.1/src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.py → opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/geographic_list.py +6 -6
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/__init__.py +0 -1
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +21 -1
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.py +11 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/test_utils.py +41 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/utils_functions.py +4 -0
- opengeodeweb_back-6.17.0rc1/tests/test_crs_routes.py +784 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_routes.py +13 -71
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/LICENSE +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/README.md +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/requirements.txt +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/setup.cfg +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/requires.txt +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/__init__.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/app_config.py +0 -0
- {opengeodeweb_back-6.16.1/src/opengeodeweb_back/routes → opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/crs}/__init__.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_functions.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/__init__.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_cross_section.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_graph.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_grid2d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_grid3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_horizon_stack3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_hybrid_solid3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_implicit_cross_section.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_implicit_structural_model.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid2d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_mesh.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_model.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_object.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface2d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_polyhedral_solid3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_regular_grid2d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_regular_grid3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_structural_model.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_tetrahedral_solid3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface2d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface3d.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_vertex_set.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/py.typed +0 -0
- {opengeodeweb_back-6.16.1/src/opengeodeweb_back/routes/create → opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes}/__init__.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/blueprint_create.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/__init__.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/apply_time_series.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/apply_time_series.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_range.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_range.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/data_missing_files.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/data_missing_files.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_range.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_range.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/export_project.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/export_project.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/import_project.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/import_project.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/kill.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_range.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_range.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_range.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_range.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_range.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_range.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_range.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_range.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/ping.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_range.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_range.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_range.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_range.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/time_series_allowed_objects.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/time_series_allowed_objects.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/time_series_missing_files.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/time_series_missing_files.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/upload_file.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/validate.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/validate.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_range.json +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_range.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/typed_route.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_create_routes.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_events.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_geode_functions.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_typed_routes.py +0 -0
- {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_utils_functions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: OpenGeodeWeb-Back
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.17.0rc1
|
|
4
4
|
Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
|
|
5
5
|
Author-email: Geode-solutions <team-web@geode-solutions.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "OpenGeodeWeb-Back"
|
|
7
|
-
version = "6.
|
|
7
|
+
version = "6.17.0-rc.1"
|
|
8
8
|
dynamic = ["dependencies"]
|
|
9
9
|
authors = [{ name = "Geode-solutions", email = "team-web@geode-solutions.com" }]
|
|
10
10
|
description = "OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem"
|
|
@@ -33,4 +33,5 @@ where = ["src"]
|
|
|
33
33
|
"opengeodeweb_back.routes.schemas" = ["*.json"]
|
|
34
34
|
"opengeodeweb_back.routes.models.schemas" = ["*.json"]
|
|
35
35
|
"opengeodeweb_back.routes.create.schemas" = ["*.json"]
|
|
36
|
+
"opengeodeweb_back.routes.crs.schemas" = ["*.json"]
|
|
36
37
|
"opengeodeweb_back" = ["py.typed"]
|
{opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: OpenGeodeWeb-Back
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.17.0rc1
|
|
4
4
|
Summary: OpenGeodeWeb-Back is an open source framework that proposes handy python functions and wrappers for the OpenGeode ecosystem
|
|
5
5
|
Author-email: Geode-solutions <team-web@geode-solutions.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/Geode-solutions/OpenGeodeWeb-Back
|
{opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt
RENAMED
|
@@ -16,7 +16,12 @@ src/opengeodeweb_back/py.typed
|
|
|
16
16
|
src/opengeodeweb_back/test_utils.py
|
|
17
17
|
src/opengeodeweb_back/typed_route.py
|
|
18
18
|
src/opengeodeweb_back/utils_functions.py
|
|
19
|
+
src/opengeodeweb_back/crs/__init__.py
|
|
20
|
+
src/opengeodeweb_back/crs/crs_alignment.py
|
|
21
|
+
src/opengeodeweb_back/crs/crs_assignment.py
|
|
22
|
+
src/opengeodeweb_back/crs/crs_functions.py
|
|
19
23
|
src/opengeodeweb_back/geode_objects/__init__.py
|
|
24
|
+
src/opengeodeweb_back/geode_objects/crs_coordinates.py
|
|
20
25
|
src/opengeodeweb_back/geode_objects/geode_brep.py
|
|
21
26
|
src/opengeodeweb_back/geode_objects/geode_cross_section.py
|
|
22
27
|
src/opengeodeweb_back/geode_objects/geode_edged_curve2d.py
|
|
@@ -62,6 +67,19 @@ src/opengeodeweb_back/routes/create/schemas/point_set.json
|
|
|
62
67
|
src/opengeodeweb_back/routes/create/schemas/point_set.py
|
|
63
68
|
src/opengeodeweb_back/routes/create/schemas/polygonal_surface.json
|
|
64
69
|
src/opengeodeweb_back/routes/create/schemas/polygonal_surface.py
|
|
70
|
+
src/opengeodeweb_back/routes/crs/__init__.py
|
|
71
|
+
src/opengeodeweb_back/routes/crs/blueprint_crs.py
|
|
72
|
+
src/opengeodeweb_back/routes/crs/schemas/__init__.py
|
|
73
|
+
src/opengeodeweb_back/routes/crs/schemas/active.json
|
|
74
|
+
src/opengeodeweb_back/routes/crs/schemas/active.py
|
|
75
|
+
src/opengeodeweb_back/routes/crs/schemas/align.json
|
|
76
|
+
src/opengeodeweb_back/routes/crs/schemas/align.py
|
|
77
|
+
src/opengeodeweb_back/routes/crs/schemas/assign_geographic.json
|
|
78
|
+
src/opengeodeweb_back/routes/crs/schemas/assign_geographic.py
|
|
79
|
+
src/opengeodeweb_back/routes/crs/schemas/convert_geographic.json
|
|
80
|
+
src/opengeodeweb_back/routes/crs/schemas/convert_geographic.py
|
|
81
|
+
src/opengeodeweb_back/routes/crs/schemas/geographic_list.json
|
|
82
|
+
src/opengeodeweb_back/routes/crs/schemas/geographic_list.py
|
|
65
83
|
src/opengeodeweb_back/routes/schemas/__init__.py
|
|
66
84
|
src/opengeodeweb_back/routes/schemas/allowed_files.json
|
|
67
85
|
src/opengeodeweb_back/routes/schemas/allowed_files.py
|
|
@@ -85,8 +103,6 @@ src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json
|
|
|
85
103
|
src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py
|
|
86
104
|
src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json
|
|
87
105
|
src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py
|
|
88
|
-
src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.json
|
|
89
|
-
src/opengeodeweb_back/routes/schemas/geographic_coordinate_systems.py
|
|
90
106
|
src/opengeodeweb_back/routes/schemas/import_project.json
|
|
91
107
|
src/opengeodeweb_back/routes/schemas/import_project.py
|
|
92
108
|
src/opengeodeweb_back/routes/schemas/kill.json
|
|
@@ -134,6 +150,7 @@ src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py
|
|
|
134
150
|
src/opengeodeweb_back/routes/schemas/vertex_attribute_range.json
|
|
135
151
|
src/opengeodeweb_back/routes/schemas/vertex_attribute_range.py
|
|
136
152
|
tests/test_create_routes.py
|
|
153
|
+
tests/test_crs_routes.py
|
|
137
154
|
tests/test_events.py
|
|
138
155
|
tests/test_geode_functions.py
|
|
139
156
|
tests/test_routes.py
|
|
@@ -20,6 +20,7 @@ from werkzeug.exceptions import HTTPException
|
|
|
20
20
|
from opengeodeweb_back import app_config, utils_functions
|
|
21
21
|
from opengeodeweb_back.routes import blueprint_routes
|
|
22
22
|
from opengeodeweb_back.routes.create import blueprint_create
|
|
23
|
+
from opengeodeweb_back.routes.crs import blueprint_crs
|
|
23
24
|
|
|
24
25
|
if TYPE_CHECKING:
|
|
25
26
|
from collections.abc import Generator
|
|
@@ -171,6 +172,11 @@ def register_ogw_back_blueprints(app: flask.Flask) -> None:
|
|
|
171
172
|
url_prefix="/opengeodeweb_back/create",
|
|
172
173
|
name="opengeodeweb_create",
|
|
173
174
|
)
|
|
175
|
+
app.register_blueprint(
|
|
176
|
+
blueprint_crs.routes,
|
|
177
|
+
url_prefix="/opengeodeweb_back/crs",
|
|
178
|
+
name="opengeodeweb_crs",
|
|
179
|
+
)
|
|
174
180
|
|
|
175
181
|
|
|
176
182
|
def run_server(app: Flask) -> None:
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""Georeferencing data from control points: similarity or affine alignment."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
# Standard library imports
|
|
6
|
+
import math
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import TYPE_CHECKING, Protocol
|
|
9
|
+
|
|
10
|
+
# Third party imports
|
|
11
|
+
import opengeode as og
|
|
12
|
+
|
|
13
|
+
# Local application imports
|
|
14
|
+
from opengeodeweb_back.crs.crs_functions import (
|
|
15
|
+
CRS_GEODE_OBJECTS_3D,
|
|
16
|
+
ORIGINAL_CRS,
|
|
17
|
+
CrsError,
|
|
18
|
+
coordinate_system,
|
|
19
|
+
geographic_info,
|
|
20
|
+
original_coordinates,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from collections.abc import Sequence
|
|
25
|
+
|
|
26
|
+
import opengeode_geosciences as og_geosciences
|
|
27
|
+
|
|
28
|
+
from opengeodeweb_back.crs.crs_functions import CrsGeodeObject
|
|
29
|
+
|
|
30
|
+
SIMILARITY = "similarity"
|
|
31
|
+
AFFINE = "affine"
|
|
32
|
+
SIMILARITY_PAIRS = (1, 2)
|
|
33
|
+
AFFINE_PAIRS = 3
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ControlPoint(Protocol):
|
|
37
|
+
x: float
|
|
38
|
+
y: float
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class SourcePoint(ControlPoint, Protocol):
|
|
42
|
+
# Picked on the displayed data rather than typed
|
|
43
|
+
picked: bool | None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass(frozen=True)
|
|
47
|
+
class Alignment:
|
|
48
|
+
source: og.CoordinateSystem2D
|
|
49
|
+
target: og.CoordinateSystem2D
|
|
50
|
+
scale: float | None
|
|
51
|
+
info: og_geosciences.GeographicCoordinateSystemInfo
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def points(control_points: Sequence[ControlPoint]) -> list[og.Point2D]:
|
|
55
|
+
return [og.Point2D([point.x, point.y]) for point in control_points]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def check_pair_count(mode: str, source_count: int, target_count: int) -> None:
|
|
59
|
+
if source_count != target_count:
|
|
60
|
+
msg = "Source and target points must come in pairs"
|
|
61
|
+
raise CrsError(msg)
|
|
62
|
+
if mode == AFFINE and source_count != AFFINE_PAIRS:
|
|
63
|
+
msg = "Affine alignment needs 3 pairs of points"
|
|
64
|
+
raise CrsError(msg)
|
|
65
|
+
if mode == SIMILARITY and source_count not in SIMILARITY_PAIRS:
|
|
66
|
+
msg = "Alignment without distortion needs 1 or 2 pairs of points"
|
|
67
|
+
raise CrsError(msg)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _crs_names(geode_object: CrsGeodeObject) -> set[str]:
|
|
71
|
+
# Model components may hold different CRS: gather them all
|
|
72
|
+
managers = [
|
|
73
|
+
mesh.main_coordinate_reference_system_manager() for mesh in geode_object.crs_meshes()
|
|
74
|
+
]
|
|
75
|
+
return {name for manager in managers for name in manager.coordinate_reference_system_names()}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def has_original_coordinates(geode_object: CrsGeodeObject) -> bool:
|
|
79
|
+
# Assigning a geographic CRS renames the "points" CRS: the assigned coordinates are the base
|
|
80
|
+
return all(
|
|
81
|
+
mesh.main_coordinate_reference_system_manager().coordinate_reference_system_exists(
|
|
82
|
+
ORIGINAL_CRS
|
|
83
|
+
)
|
|
84
|
+
for mesh in geode_object.crs_meshes()
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _delete_other_crs(geode_object: CrsGeodeObject, *kept: str) -> None:
|
|
89
|
+
for crs_name in _crs_names(geode_object):
|
|
90
|
+
if crs_name not in kept:
|
|
91
|
+
geode_object.delete_crs(crs_name)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def source_points_in_original_coordinates(
|
|
95
|
+
geode_object: CrsGeodeObject, source_points: Sequence[SourcePoint]
|
|
96
|
+
) -> list[og.Point2D]:
|
|
97
|
+
"""Source points in the loaded coordinates: alignments must not stack.
|
|
98
|
+
|
|
99
|
+
Picked points lie on the displayed data: they are mapped back.
|
|
100
|
+
Typed points are already original coordinates.
|
|
101
|
+
"""
|
|
102
|
+
typed = points(source_points)
|
|
103
|
+
if geographic_info(geode_object.crs_manager()) is None or not has_original_coordinates(
|
|
104
|
+
geode_object
|
|
105
|
+
):
|
|
106
|
+
return typed
|
|
107
|
+
original_points = original_coordinates(geode_object, typed)
|
|
108
|
+
if original_points is None:
|
|
109
|
+
if any(point.picked for point in source_points):
|
|
110
|
+
msg = "Data has no three non-colinear vertices to re-align"
|
|
111
|
+
raise CrsError(msg)
|
|
112
|
+
return typed
|
|
113
|
+
return [
|
|
114
|
+
original if source.picked else point
|
|
115
|
+
for source, original, point in zip(source_points, original_points, typed, strict=True)
|
|
116
|
+
]
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _restart_alignment(geode_object: CrsGeodeObject) -> bool:
|
|
120
|
+
"""Go back to the loaded coordinates. True when only the active ones can be aligned."""
|
|
121
|
+
if geographic_info(geode_object.crs_manager()) is None:
|
|
122
|
+
return False
|
|
123
|
+
if not has_original_coordinates(geode_object):
|
|
124
|
+
return True
|
|
125
|
+
geode_object.set_active_crs(ORIGINAL_CRS)
|
|
126
|
+
_delete_other_crs(geode_object, ORIGINAL_CRS)
|
|
127
|
+
return False
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _frame(origin: og.Point2D, x: float, y: float) -> og.CoordinateSystem2D:
|
|
131
|
+
# Perpendicular axes of equal length: going from one frame to another is a similarity
|
|
132
|
+
return og.CoordinateSystem2D([og.Vector2D([x, y]), og.Vector2D([-y, x])], origin)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _similarity_coordinate_systems(
|
|
136
|
+
source: list[og.Point2D], target: list[og.Point2D]
|
|
137
|
+
) -> tuple[og.CoordinateSystem2D, og.CoordinateSystem2D, float, float]:
|
|
138
|
+
"""Frames moving source onto target without distortion, with the scale and rotation."""
|
|
139
|
+
if len(source) == 1:
|
|
140
|
+
return _frame(source[0], 1, 0), _frame(target[0], 1, 0), 1.0, 0.0
|
|
141
|
+
source_x = source[1].value(0) - source[0].value(0)
|
|
142
|
+
source_y = source[1].value(1) - source[0].value(1)
|
|
143
|
+
target_x = target[1].value(0) - target[0].value(0)
|
|
144
|
+
target_y = target[1].value(1) - target[0].value(1)
|
|
145
|
+
source_length = math.hypot(source_x, source_y)
|
|
146
|
+
target_length = math.hypot(target_x, target_y)
|
|
147
|
+
if source_length == 0 or target_length == 0:
|
|
148
|
+
msg = "The two points of the source or of the target must differ"
|
|
149
|
+
raise CrsError(msg)
|
|
150
|
+
rotation = math.degrees(
|
|
151
|
+
math.atan2(
|
|
152
|
+
source_x * target_y - source_y * target_x, source_x * target_x + source_y * target_y
|
|
153
|
+
)
|
|
154
|
+
)
|
|
155
|
+
return (
|
|
156
|
+
_frame(source[0], source_x, source_y),
|
|
157
|
+
_frame(target[0], target_x, target_y),
|
|
158
|
+
target_length / source_length,
|
|
159
|
+
rotation,
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def colinear(frame_points: list[og.Point2D]) -> bool:
|
|
164
|
+
origin, first, second = frame_points
|
|
165
|
+
first_x = first.value(0) - origin.value(0)
|
|
166
|
+
first_y = first.value(1) - origin.value(1)
|
|
167
|
+
second_x = second.value(0) - origin.value(0)
|
|
168
|
+
second_y = second.value(1) - origin.value(1)
|
|
169
|
+
# Relative to the size of the triangle: coordinates may be in metres or millions of metres
|
|
170
|
+
scale = max(math.hypot(first_x, first_y), math.hypot(second_x, second_y)) ** 2
|
|
171
|
+
return scale == 0 or abs(first_x * second_y - first_y * second_x) <= 1e-12 * scale
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def coordinate_systems(
|
|
175
|
+
mode: str, source_points: list[og.Point2D], target_points: list[og.Point2D]
|
|
176
|
+
) -> tuple[og.CoordinateSystem2D, og.CoordinateSystem2D, float | None, float | None]:
|
|
177
|
+
"""Frames moving source onto target, with the scale and rotation without distortion."""
|
|
178
|
+
if mode == SIMILARITY:
|
|
179
|
+
return _similarity_coordinate_systems(source_points, target_points)
|
|
180
|
+
# Checked here: any other error of OpenGeode is not the user's and is not hidden
|
|
181
|
+
if colinear(source_points) or colinear(target_points):
|
|
182
|
+
msg = "Points must not be colinear"
|
|
183
|
+
raise CrsError(msg)
|
|
184
|
+
return coordinate_system(source_points), coordinate_system(target_points), None, None
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def apply_alignment(geode_object: CrsGeodeObject, alignment: Alignment) -> None:
|
|
188
|
+
from_active = _restart_alignment(geode_object)
|
|
189
|
+
geode_object.create_crs("aligned", alignment.source, alignment.target)
|
|
190
|
+
# The aligned CRS is active: scale its Z so the data keeps its proportions
|
|
191
|
+
scale = alignment.scale
|
|
192
|
+
if scale is not None and scale != 1 and isinstance(geode_object, CRS_GEODE_OBJECTS_3D):
|
|
193
|
+
geode_object.scale_z(scale)
|
|
194
|
+
if from_active:
|
|
195
|
+
# The previous geographic CRS and its coordinates would clash with the new assignment
|
|
196
|
+
_delete_other_crs(geode_object, "aligned", ORIGINAL_CRS)
|
|
197
|
+
geode_object.assign_crs(alignment.info.authority_code(), alignment.info)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""Assigning a geographic CRS to data, and converting data to another one."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
# Standard library imports
|
|
6
|
+
import logging
|
|
7
|
+
from typing import TYPE_CHECKING, Any
|
|
8
|
+
|
|
9
|
+
# Third party imports
|
|
10
|
+
import opengeode as og
|
|
11
|
+
|
|
12
|
+
# Local application imports
|
|
13
|
+
from opengeodeweb_back import geode_functions
|
|
14
|
+
from opengeodeweb_back.crs.crs_functions import (
|
|
15
|
+
ORIGINAL_CRS,
|
|
16
|
+
CrsError,
|
|
17
|
+
active_crs,
|
|
18
|
+
coordinate_system,
|
|
19
|
+
coordinates_implausible,
|
|
20
|
+
geographic_info,
|
|
21
|
+
known_info,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
import opengeode_geosciences as og_geosciences
|
|
26
|
+
from opengeodeweb_microservice.database.data import Data
|
|
27
|
+
|
|
28
|
+
from opengeodeweb_back.crs.crs_functions import CrsGeodeObject
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def prepare_crs_name(geode_object: CrsGeodeObject, crs_name: str) -> None:
|
|
34
|
+
crs_manager = geode_object.crs_manager()
|
|
35
|
+
info = geographic_info(crs_manager)
|
|
36
|
+
if info is not None and info.authority_code() == crs_name:
|
|
37
|
+
msg = f"{crs_name} is already the active CRS"
|
|
38
|
+
raise CrsError(msg)
|
|
39
|
+
# A registered inactive CRS may hold coordinates derived from an outdated label: recompute it
|
|
40
|
+
if crs_manager.coordinate_reference_system_exists(crs_name):
|
|
41
|
+
geode_object.delete_crs(crs_name)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _keep_original_coordinates(geode_object: CrsGeodeObject) -> None:
|
|
45
|
+
"""Assigning renames the active CRS: assign a copy so "points" survives for re-align."""
|
|
46
|
+
if not all(
|
|
47
|
+
mesh.main_coordinate_reference_system_manager().active_coordinate_reference_system_name()
|
|
48
|
+
== ORIGINAL_CRS
|
|
49
|
+
for mesh in geode_object.crs_meshes()
|
|
50
|
+
):
|
|
51
|
+
return
|
|
52
|
+
identity = coordinate_system([og.Point2D([0, 0]), og.Point2D([1, 0]), og.Point2D([0, 1])])
|
|
53
|
+
geode_object.create_crs("assigned", identity, identity)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _assign(
|
|
57
|
+
geode_object: CrsGeodeObject, authority: str, code: str
|
|
58
|
+
) -> og_geosciences.GeographicCoordinateSystemInfo:
|
|
59
|
+
info = known_info(geode_object, authority, code)
|
|
60
|
+
prepare_crs_name(geode_object, info.authority_code())
|
|
61
|
+
_keep_original_coordinates(geode_object)
|
|
62
|
+
geode_object.assign_crs(info.authority_code(), info)
|
|
63
|
+
return info
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def assign_all(
|
|
67
|
+
targets: list[tuple[str, Data, CrsGeodeObject]],
|
|
68
|
+
authority: str,
|
|
69
|
+
code: str,
|
|
70
|
+
*,
|
|
71
|
+
only_plausible: bool,
|
|
72
|
+
) -> dict[str, dict[str, Any]]:
|
|
73
|
+
"""Assign the CRS to every target and save them. Per id: implausible, and crs if assigned.
|
|
74
|
+
|
|
75
|
+
Without only_plausible, the plausibility is a warning only: the label is kept.
|
|
76
|
+
"""
|
|
77
|
+
# Checked before any change: with only_plausible, an implausible data is left as it is
|
|
78
|
+
implausible = {
|
|
79
|
+
target_id: coordinates_implausible(
|
|
80
|
+
target_object, known_info(target_object, authority, code)
|
|
81
|
+
)
|
|
82
|
+
for target_id, _, target_object in targets
|
|
83
|
+
}
|
|
84
|
+
assigned = {
|
|
85
|
+
target_id for target_id, _, _ in targets if not (only_plausible and implausible[target_id])
|
|
86
|
+
}
|
|
87
|
+
# Every data is assigned in memory before any file is written
|
|
88
|
+
for target_id, _, target_object in targets:
|
|
89
|
+
if target_id in assigned:
|
|
90
|
+
_assign(target_object, authority, code)
|
|
91
|
+
# Assigning only relabels the coordinates: the viewables are unchanged
|
|
92
|
+
for target_id, target_data, target_object in targets:
|
|
93
|
+
if target_id in assigned:
|
|
94
|
+
target_object.save(geode_functions.data_file_path(target_id, target_data.native_file))
|
|
95
|
+
entries: dict[str, dict[str, Any]] = {}
|
|
96
|
+
for target_id, _, target_object in targets:
|
|
97
|
+
entry: dict[str, Any] = {"implausible": implausible[target_id]}
|
|
98
|
+
if target_id in assigned:
|
|
99
|
+
entry["crs"] = active_crs(target_object)
|
|
100
|
+
entries[target_id] = entry
|
|
101
|
+
return entries
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def convert(geode_object: CrsGeodeObject, authority: str, code: str) -> None:
|
|
105
|
+
if geographic_info(geode_object.crs_manager()) is None:
|
|
106
|
+
msg = "Assign a geographic CRS before converting"
|
|
107
|
+
raise CrsError(msg)
|
|
108
|
+
info = known_info(geode_object, authority, code)
|
|
109
|
+
prepare_crs_name(geode_object, info.authority_code())
|
|
110
|
+
try:
|
|
111
|
+
geode_object.convert_crs(info.authority_code(), info)
|
|
112
|
+
except RuntimeError as error:
|
|
113
|
+
# Usually PROJ rejecting coordinates outside the source or target CRS domain: the
|
|
114
|
+
# Message tells, and the log keeps the trace for any other OpenGeode error
|
|
115
|
+
logger.exception("Conversion to %s failed", info.authority_code())
|
|
116
|
+
msg = f"Coordinates cannot be converted to {info.authority_code()}: {error}"
|
|
117
|
+
raise CrsError(msg) from error
|