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.
Files changed (160) hide show
  1. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/PKG-INFO +1 -1
  2. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/pyproject.toml +2 -1
  3. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/PKG-INFO +1 -1
  4. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/SOURCES.txt +19 -2
  5. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/app.py +6 -0
  6. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/crs/crs_alignment.py +197 -0
  7. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/crs/crs_assignment.py +117 -0
  8. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/crs/crs_functions.py +360 -0
  9. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/geode_objects/crs_coordinates.py +61 -0
  10. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_brep.py +85 -0
  11. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_edged_curve2d.py +17 -0
  12. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_edged_curve3d.py +20 -0
  13. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_point_set2d.py +17 -0
  14. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_point_set3d.py +20 -0
  15. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_section.py +61 -0
  16. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_solid_mesh3d.py +20 -0
  17. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_surface_mesh2d.py +17 -0
  18. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_surface_mesh3d.py +20 -0
  19. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/blueprint_routes.py +0 -20
  20. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/create/__init__.py +0 -0
  21. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/edged_curve.json +21 -1
  22. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/edged_curve.py +11 -0
  23. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/point_set.json +21 -1
  24. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/point_set.py +11 -0
  25. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.json +21 -1
  26. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/polygonal_surface.py +11 -0
  27. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/__init__.py +0 -0
  28. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/blueprint_crs.py +152 -0
  29. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/__init__.py +5 -0
  30. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/active.json +50 -0
  31. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/active.py +42 -0
  32. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/align.json +171 -0
  33. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/align.py +97 -0
  34. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/assign_geographic.json +113 -0
  35. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/assign_geographic.py +69 -0
  36. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/convert_geographic.json +110 -0
  37. opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes/crs/schemas/convert_geographic.py +68 -0
  38. 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
  39. 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
  40. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/__init__.py +0 -1
  41. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.json +21 -1
  42. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/save_viewable_file.py +11 -0
  43. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/test_utils.py +41 -0
  44. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/utils_functions.py +4 -0
  45. opengeodeweb_back-6.17.0rc1/tests/test_crs_routes.py +784 -0
  46. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_routes.py +13 -71
  47. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/LICENSE +0 -0
  48. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/README.md +0 -0
  49. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/requirements.txt +0 -0
  50. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/setup.cfg +0 -0
  51. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/dependency_links.txt +0 -0
  52. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/entry_points.txt +0 -0
  53. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/requires.txt +0 -0
  54. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/OpenGeodeWeb_Back.egg-info/top_level.txt +0 -0
  55. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/__init__.py +0 -0
  56. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/app_config.py +0 -0
  57. {opengeodeweb_back-6.16.1/src/opengeodeweb_back/routes → opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/crs}/__init__.py +0 -0
  58. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_functions.py +0 -0
  59. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/__init__.py +0 -0
  60. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_cross_section.py +0 -0
  61. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_graph.py +0 -0
  62. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_grid2d.py +0 -0
  63. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_grid3d.py +0 -0
  64. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_horizon_stack3d.py +0 -0
  65. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_hybrid_solid3d.py +0 -0
  66. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_implicit_cross_section.py +0 -0
  67. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_implicit_structural_model.py +0 -0
  68. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid2d.py +0 -0
  69. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_light_regular_grid3d.py +0 -0
  70. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_mesh.py +0 -0
  71. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_model.py +0 -0
  72. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_object.py +0 -0
  73. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface2d.py +0 -0
  74. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_polygonal_surface3d.py +0 -0
  75. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_polyhedral_solid3d.py +0 -0
  76. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_raster_image2d.py +0 -0
  77. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_raster_image3d.py +0 -0
  78. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_regular_grid2d.py +0 -0
  79. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_regular_grid3d.py +0 -0
  80. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_structural_model.py +0 -0
  81. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_tetrahedral_solid3d.py +0 -0
  82. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface2d.py +0 -0
  83. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_triangulated_surface3d.py +0 -0
  84. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/geode_objects/geode_vertex_set.py +0 -0
  85. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/py.typed +0 -0
  86. {opengeodeweb_back-6.16.1/src/opengeodeweb_back/routes/create → opengeodeweb_back-6.17.0rc1/src/opengeodeweb_back/routes}/__init__.py +0 -0
  87. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/blueprint_create.py +0 -0
  88. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/create/schemas/__init__.py +0 -0
  89. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.json +0 -0
  90. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_files.py +0 -0
  91. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.json +0 -0
  92. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/allowed_objects.py +0 -0
  93. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/apply_time_series.json +0 -0
  94. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/apply_time_series.py +0 -0
  95. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.json +0 -0
  96. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_names.py +0 -0
  97. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_range.json +0 -0
  98. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/cell_attribute_range.py +0 -0
  99. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/data_missing_files.json +0 -0
  100. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/data_missing_files.py +0 -0
  101. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.json +0 -0
  102. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_names.py +0 -0
  103. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_range.json +0 -0
  104. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/edge_attribute_range.py +0 -0
  105. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/export_project.json +0 -0
  106. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/export_project.py +0 -0
  107. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.json +0 -0
  108. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/geode_object_inheritance.py +0 -0
  109. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.json +0 -0
  110. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/geode_objects_and_output_extensions.py +0 -0
  111. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/import_project.json +0 -0
  112. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/import_project.py +0 -0
  113. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/kill.json +0 -0
  114. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/kill.py +0 -0
  115. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.json +0 -0
  116. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_names.py +0 -0
  117. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_range.json +0 -0
  118. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_edge_attribute_range.py +0 -0
  119. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.json +0 -0
  120. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_names.py +0 -0
  121. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_range.json +0 -0
  122. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polygon_attribute_range.py +0 -0
  123. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.json +0 -0
  124. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_names.py +0 -0
  125. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_range.json +0 -0
  126. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_polyhedron_attribute_range.py +0 -0
  127. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.json +0 -0
  128. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_names.py +0 -0
  129. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_range.json +0 -0
  130. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/model_component_vertex_attribute_range.py +0 -0
  131. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/ping.json +0 -0
  132. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/ping.py +0 -0
  133. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.json +0 -0
  134. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_names.py +0 -0
  135. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_range.json +0 -0
  136. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polygon_attribute_range.py +0 -0
  137. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.json +0 -0
  138. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_names.py +0 -0
  139. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_range.json +0 -0
  140. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/polyhedron_attribute_range.py +0 -0
  141. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.json +0 -0
  142. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/texture_coordinates.py +0 -0
  143. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/time_series_allowed_objects.json +0 -0
  144. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/time_series_allowed_objects.py +0 -0
  145. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/time_series_missing_files.json +0 -0
  146. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/time_series_missing_files.py +0 -0
  147. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/upload_file.json +0 -0
  148. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/upload_file.py +0 -0
  149. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/validate.json +0 -0
  150. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/validate.py +0 -0
  151. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.json +0 -0
  152. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_names.py +0 -0
  153. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_range.json +0 -0
  154. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/routes/schemas/vertex_attribute_range.py +0 -0
  155. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/src/opengeodeweb_back/typed_route.py +0 -0
  156. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_create_routes.py +0 -0
  157. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_events.py +0 -0
  158. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_geode_functions.py +0 -0
  159. {opengeodeweb_back-6.16.1 → opengeodeweb_back-6.17.0rc1}/tests/test_typed_routes.py +0 -0
  160. {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.16.1
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.16.1"
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"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: OpenGeodeWeb-Back
3
- Version: 6.16.1
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
@@ -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