From f4c30a22a51efc34476b19f1b81ce58be5901143 Mon Sep 17 00:00:00 2001 From: Valentin Gauthier Date: Tue, 28 Jul 2026 16:21:34 +0200 Subject: [PATCH 01/14] update to generate multiple random data with one command --- energyml-utils/README.md | 5 + energyml-utils/example/tools.py | 406 ++++++++++++++---- energyml-utils/pyproject.toml | 2 + energyml-utils/src/energyml/utils/epc.py | 12 +- .../src/energyml/utils/introspection.py | 65 ++- energyml-utils/validation_drogon22_extras.txt | Bin 0 -> 3923886 bytes 6 files changed, 386 insertions(+), 104 deletions(-) create mode 100644 energyml-utils/validation_drogon22_extras.txt diff --git a/energyml-utils/README.md b/energyml-utils/README.md index b292c01..8e66137 100644 --- a/energyml-utils/README.md +++ b/energyml-utils/README.md @@ -399,6 +399,11 @@ Using qualified type: poetry run generate_data --type "resqml22.WellboreFeature" --file-format json ``` +Generate multiple data : +```bash +poetry run generate_multiple_data -o generated -ff xml -t eml23.AbstractObject --exclude witsml --exclude prodml +``` + ### XML to JSON Conversion Convert an XML file to JSON: diff --git a/energyml-utils/example/tools.py b/energyml-utils/example/tools.py index 938a058..1592712 100644 --- a/energyml-utils/example/tools.py +++ b/energyml-utils/example/tools.py @@ -5,7 +5,7 @@ import os import pathlib import traceback -from typing import Optional, List, Dict, Any +from typing import Callable, Optional, List, Dict, Any import sys from pathlib import Path @@ -13,15 +13,18 @@ src_path = Path(__file__).parent.parent / "src" sys.path.insert(0, str(src_path)) +from energyml.utils.epc_utils import get_epc_content_type_path from energyml.utils.validation import ErrorType, validate_epc -from energyml.utils.constants import get_property_kind_dict_path_as_xml +from energyml.utils.constants import EpcExportVersion, get_property_kind_dict_path_as_xml from energyml.utils.data.datasets_io import CSVFileReader, HDF5FileWriter, ParquetFileWriter, DATFileReader from energyml.utils.data.mesh import MeshFileFormat, export_multiple_data, export_obj, read_mesh_object from energyml.utils.epc import Epc, gen_energyml_object_path from energyml.utils.introspection import ( get_class_from_simple_name, get_enum_values, + get_non_abstract_classes, + is_abstract, get_module_name_and_type_from_content_or_qualified_type, random_value_from_class, search_class_in_module_from_partial_name, @@ -278,6 +281,136 @@ def csv_to_dataset(): ) +def _find_class_from_type_name(type_name: str): + """ + Search a class from a full python path (e.g. 'energyml.resqml.v2_2.resqmlv2.TriangulatedSetRepresentation') + or from a qualified type (e.g. 'resqml22.TriangulatedSetRepresentation'). + :param type_name: + :return: the class or None if not found + """ + try: + return get_class_from_simple_name(type_name[type_name.rindex(".") + 1 :], [type_name[: type_name.rindex(".")]]) + except (NameError, ValueError): + try: + return get_class_from_qualified_type(type_name) + except ValueError: + return None + + +def _print_close_type_names(type_name: str): + """Print the types that look like @type_name, to help the user to fix its input.""" + print(f"Class not found for '{type_name}', please check the type name.") + try: + module_name, object_type = get_module_name_and_type_from_content_or_qualified_type(type_name) + except ValueError: + return + print("Possible types are :") + for cn in search_class_in_module_from_partial_name(module_name, object_type): + print(f" - {cn.__name__}") + + +def _serialize_object(obj, file_format: str) -> str: + if file_format.lower() == "xml": + return serialize_xml(obj) + else: + return serialize_json(obj, JSON_VERSION.OSDU_OFFICIAL) + + +def _file_name_prefix(obj) -> str: + """ + File name prefix for a generated object : its qualified type (e.g. 'resqml22.TriangulatedSetRepresentation'), + or its class name if the qualified type cannot be computed. + :param obj: + :return: str + """ + try: + return get_qualified_type_from_class(obj) or type(obj).__name__ + except Exception: + return type(obj).__name__ + + +def _is_excluded(cls, exclude: Optional[List[str]]) -> bool: + """ + Test if the class @cls must be excluded : it is the case if one of the @exclude values is contained (case + insensitive) in one of the following values : + - the module of the class (e.g. 'energyml.witsml.v2_1.witsmlv2'), + - the class name (e.g. 'Trajectory'), + - the full path 'module.ClassName', + - the qualified type of the class (e.g. 'witsml21.Trajectory'). + + E.g. '-e witsml' excludes every witsml class, '-e trajectory' excludes every class named '*Trajectory*'. + :param cls: + :param exclude: + :return: bool + """ + if not exclude: + return False + + module_name = getattr(cls, "__module__", "") or "" + class_name = getattr(cls, "__name__", "") or "" + searched_in = [module_name, class_name, f"{module_name}.{class_name}"] + try: + searched_in.append(get_qualified_type_from_class(cls) or "") + except Exception: + pass + searched_in = [value.lower() for value in searched_in if len(value) > 0] + + return any(excluded.lower() in value for excluded in exclude for value in searched_in) + + +def _generate_random_objects( + obj_class, + callback: Optional[Callable[[Any], None]] = None, + exclude: Optional[List[str]] = None, +) -> List[Any]: + """ + Generate a random object for @obj_class, or, if @obj_class is abstract, one random object per non abstract + sub class of @obj_class. + :param obj_class: + :param callback: if not None, it is called with each object right after its generation (e.g. to write it on the + disk without waiting for the end of the whole generation). In that case, the objects are not + kept in memory and an empty list is returned. + :param exclude: list of values : every class matching one of them (see @_is_excluded) is not generated + :return: a list of generated objects, or an empty list if a @callback was given + """ + if is_abstract(obj_class): + classes_to_generate = get_non_abstract_classes(obj_class) + if len(classes_to_generate) == 0: + print(f"No instanciable sub class found for the abstract class '{obj_class.__name__}'.") + return [] + + nb_found = len(classes_to_generate) + classes_to_generate = [cls for cls in classes_to_generate if not _is_excluded(cls, exclude)] + nb_excluded = nb_found - len(classes_to_generate) + + excluded_msg = f", {nb_excluded} excluded" if nb_excluded > 0 else "" + print( + f"'{obj_class.__name__}' is abstract : generating one object per sub class " + f"({nb_found} found{excluded_msg})." + ) + elif _is_excluded(obj_class, exclude): + print(f"'{obj_class.__name__}' is excluded by the filter.") + return [] + else: + classes_to_generate = [obj_class] + + objs = [] + for cls in classes_to_generate: + # a failure on one class must not stop the generation of the others + try: + obj = random_value_from_class(cls) + except Exception as e: + print(f"Failed to generate an object for '{cls.__name__}' : {type(e).__name__}: {e}") + continue + + if callback is not None: + callback(obj) + else: + objs.append(obj) + + return objs + + def generate_data(): parser = argparse.ArgumentParser() parser.add_argument( @@ -298,27 +431,95 @@ def generate_data(): args = parser.parse_args() - obj_class = None - try: - obj_class = get_class_from_simple_name( - args.type[args.type.rindex(".") + 1 :], [args.type[: args.type.rindex(".")]] - ) - except NameError: - obj_class = get_class_from_qualified_type(args.type) + obj_class = _find_class_from_type_name(args.type) if obj_class is None: - print("Class not found, please check the type name.") - print("Possible types are :") - module_name, object_type = get_module_name_and_type_from_content_or_qualified_type(args.type) - for cn in search_class_in_module_from_partial_name(module_name, object_type): - print(f" - {cn.__name__}") + _print_close_type_names(args.type) return - obj = random_value_from_class(obj_class) - if args.file_format.lower() == "xml": - print(serialize_xml(obj)) - else: - print(serialize_json(obj, JSON_VERSION.OSDU_OFFICIAL)) + for obj in _generate_random_objects(obj_class): + print(_serialize_object(obj, args.file_format)) + + +def generate_multiple_data(): + """ + Same as @generate_data but for several object types at once, sharing a common file format. + If an output folder is given, one file per object is written in it (as soon as it is generated), else all + objects are printed on stdout. + """ + parser = argparse.ArgumentParser() + parser.add_argument( + "--type", + "-t", + type=str, + nargs="+", + default=["energyml.resqml.v2_2.resqmlv2.TriangulatedSetRepresentation"], + help="Object types (e.g. energyml.resqml.v2_2.resqmlv2.TriangulatedSetRepresentation " + "energyml.resqml.v2_2.resqmlv2.PolylineSetRepresentation)", + ) + + parser.add_argument( + "--file-format", + "-ff", + type=str, + default="json", + help="Type of the output files (one of : ['json', 'xml']). Default is 'json'", + ) + + parser.add_argument( + "--output", + "-o", + type=str, + default=None, + help="Output folder path. If not set, the objects are printed on the standard output", + ) + + parser.add_argument( + "--exclude", + "-e", + type=str, + nargs="+", + action="extend", # to support both '-e witsml prodml' and '-e witsml -e prodml' + default=[], + help="Do not generate the classes whose module, class name, 'module.ClassName' or qualified type contains " + "one of these values (case insensitive). E.g. '-e witsml prodml' skips every witsml and prodml class", + ) + + args = parser.parse_args() + + file_format = args.file_format.lower() + if file_format not in ["json", "xml"]: + print(f"Unknown file format '{args.file_format}', please use one of : ['json', 'xml']") + return + + if args.output is not None: + pathlib.Path(args.output).mkdir(parents=True, exist_ok=True) + + def export_object(obj): + """Export an object as soon as it has been generated : one file per object, or the standard output.""" + try: + content = _serialize_object(obj, file_format) + except Exception as e: + print(f"Failed to serialize an object of type '{type(obj).__name__}' : {type(e).__name__}: {e}") + return + + if args.output is None: + print(f"# ----- {type(obj).__name__} -----") + print(content) + else: + file_path = os.path.join(args.output, f"{_file_name_prefix(obj)}_{get_obj_uuid(obj)}.{file_format}") + with open(file_path, "w", encoding="utf-8") as f: + f.write(content) + print(f"Object written in {file_path}") + + for type_name in args.type: + obj_class = _find_class_from_type_name(type_name) + + if obj_class is None: + _print_close_type_names(type_name) + continue + + _generate_random_objects(obj_class, callback=export_object, exclude=args.exclude) _sample_osdu_map_ = { @@ -458,6 +659,81 @@ def json_to_epc(): epc.export_file(args.out) +def _package_file_or_folder_in_epc(input_path: str) -> Epc: + objects = [] + + if not os.path.exists(input_path): + print(f"File {input_path} does not exist.") + return + elif not os.path.isdir(input_path) and not input_path.lower().endswith((".json", ".xml", ".epc")): + print(f"File {input_path} is not a valid input file (should be a folder or a json/xml/epc file).") + return + elif os.path.isdir(input_path): + for filename in os.listdir(input_path): + f = os.path.join(input_path, filename) + if os.path.isfile(f): + if f.endswith(".json"): + with open(f, "rb") as file: + f_content = file.read() + try: + objs = read_energyml_json_bytes(f_content, JSON_VERSION.OSDU_OFFICIAL) + objects.extend(objs) + except Exception as e: + print(f"File {filename} is NOT a valid EnergyML JSON file: {e}") + elif f.endswith(".xml"): + if get_epc_content_type_path() not in f: + with open(f, "rb") as file: + f_content = file.read() + try: + obj = read_energyml_xml_bytes(f_content) + objects.append(obj) + except Exception as e: + print(f"File {filename} is NOT a valid EnergyML XML file: {e}") + elif f.endswith(".epc"): + try: + epc = Epc.read_file(f) + if epc is not None: + objects.extend(epc.energyml_objects) + else: + print(f"File {filename} is NOT a valid EnergyML EPC file: Empty EPC") + except Exception as e: + print(f"File {filename} is NOT a valid EnergyML EPC file: {e}") + elif os.path.isfile(input_path): + f = input_path + filename = os.path.basename(f) + if f.endswith(".json"): + with open(f, "rb") as file: + f_content = file.read() + try: + objs = read_energyml_json_bytes(f_content, JSON_VERSION.OSDU_OFFICIAL) + objects.extend(objs) + except Exception as e: + print(f"File {filename} is NOT a valid EnergyML JSON file: {e}") + elif f.endswith(".xml"): + if get_epc_content_type_path() not in f: + with open(f, "rb") as file: + f_content = file.read() + try: + obj = read_energyml_xml_bytes(f_content) + objects.append(obj) + except Exception as e: + print(f"File {filename} is NOT a valid EnergyML XML file: {e}") + elif f.endswith(".epc"): + try: + epc = Epc.read_file(f) + if epc is not None: + objects.extend(epc.energyml_objects) + else: + print(f"File {filename} is NOT a valid EnergyML EPC file: Empty EPC") + except Exception as e: + traceback.print_exc() + print(f"File {filename} is NOT a valid EnergyML EPC file: {e}") + + epc = Epc() + epc.energyml_objects = objects + return epc + + def describe_as_csv(): parser = argparse.ArgumentParser() parser.add_argument("--folder", "-f", type=str, help="Input File") @@ -546,6 +822,28 @@ def describe_as_csv(): print("Finished") +def load_n_save(): + parser = argparse.ArgumentParser() + # parser.add_argument("--folder", type=str, help="Input folder") + parser.add_argument("--file", "-f", type=str, help="Input file (json or xml or epc)") + parser.add_argument("--output", "-o", type=str, help="Output file epc path") + parser.add_argument( + "--pkg-classical", action="store_true", help="Use classical packaging (one file per object) instead of EPC" + ) + + args = parser.parse_args() + + epc = _package_file_or_folder_in_epc(args.file) + export_version = EpcExportVersion.CLASSIC if args.pkg_classical else EpcExportVersion.EXPANDED + + epc.export_version = export_version + + output_path = args.output or ( + args.file[:-4] + "_bis.epc" if args.file.lower().endswith(".epc") else args.file + "_bis.epc" + ) + epc.export_file(output_path) + + def validate_files(): parser = argparse.ArgumentParser() # parser.add_argument("--folder", type=str, help="Input folder") @@ -573,75 +871,7 @@ def validate_files(): args = parser.parse_args() - objects = [] - - if not os.path.exists(args.file): - print(f"File {args.file} does not exist.") - return - elif not os.path.isdir(args.file) and not args.file.lower().endswith((".json", ".xml", ".epc")): - print(f"File {args.file} is not a valid input file (should be a folder or a json/xml/epc file).") - return - elif os.path.isdir(args.file): - for filename in os.listdir(args.file): - f = os.path.join(args.file, filename) - if os.path.isfile(f): - if f.endswith(".json"): - with open(f, "rb") as file: - f_content = file.read() - try: - objs = read_energyml_json_bytes(f_content, JSON_VERSION.OSDU_OFFICIAL) - objects.extend(objs) - except Exception as e: - print(f"File {filename} is NOT a valid EnergyML JSON file: {e}") - elif f.endswith(".xml"): - with open(f, "rb") as file: - f_content = file.read() - try: - obj = read_energyml_xml_bytes(f_content) - objects.append(obj) - except Exception as e: - print(f"File {filename} is NOT a valid EnergyML XML file: {e}") - elif f.endswith(".epc"): - try: - epc = Epc.read_file(f) - if epc is not None: - objects.extend(epc.energyml_objects) - else: - print(f"File {filename} is NOT a valid EnergyML EPC file: Empty EPC") - except Exception as e: - print(f"File {filename} is NOT a valid EnergyML EPC file: {e}") - elif os.path.isfile(args.file): - f = args.file - filename = os.path.basename(f) - if f.endswith(".json"): - with open(f, "rb") as file: - f_content = file.read() - try: - objs = read_energyml_json_bytes(f_content, JSON_VERSION.OSDU_OFFICIAL) - objects.extend(objs) - except Exception as e: - print(f"File {filename} is NOT a valid EnergyML JSON file: {e}") - elif f.endswith(".xml"): - with open(f, "rb") as file: - f_content = file.read() - try: - obj = read_energyml_xml_bytes(f_content) - objects.append(obj) - except Exception as e: - print(f"File {filename} is NOT a valid EnergyML XML file: {e}") - elif f.endswith(".epc"): - try: - epc = Epc.read_file(f) - if epc is not None: - objects.extend(epc.energyml_objects) - else: - print(f"File {filename} is NOT a valid EnergyML EPC file: Empty EPC") - except Exception as e: - traceback.print_exc() - print(f"File {filename} is NOT a valid EnergyML EPC file: {e}") - - epc = Epc() - epc.energyml_objects = objects + epc = _package_file_or_folder_in_epc(args.file) err_json = [ err.toJson() diff --git a/energyml-utils/pyproject.toml b/energyml-utils/pyproject.toml index e87f632..ac7de7c 100644 --- a/energyml-utils/pyproject.toml +++ b/energyml-utils/pyproject.toml @@ -152,8 +152,10 @@ format-jinja = """ extract_3d = "example.tools:extract_representation_in_3d_file" csv_to_dataset = "example.tools:csv_to_dataset" generate_data = "example.tools:generate_data" +generate_multiple_data = "example.tools:generate_multiple_data" xml_to_json = "example.tools:xml_to_json" json_to_xml = "example.tools:json_to_xml" json_to_epc = "example.tools:json_to_epc" +loadNsave = "example.tools:load_n_save" describe_as_csv = "example.tools:describe_as_csv" validate = "example.tools:validate_files" \ No newline at end of file diff --git a/energyml-utils/src/energyml/utils/epc.py b/energyml-utils/src/energyml/utils/epc.py index e1e9782..1ad4ace 100644 --- a/energyml-utils/src/energyml/utils/epc.py +++ b/energyml-utils/src/energyml/utils/epc.py @@ -690,18 +690,18 @@ def wrapper(*args, **kwargs): file_path = kwargs["epc_file_path"] path_info = f" [{file_path}]" if file_path else "" - print(f"⏱️ [{timestamp_start}] Starting {func_name}{path_info}") + logging.debug(f"⏱️ [{timestamp_start}] Starting {func_name}{path_info}") try: result = func(*args, **kwargs) elapsed = time.perf_counter() - start_time timestamp_end = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] - print(f"✅ [{timestamp_end}] Completed {func_name} in {elapsed:.3f}s{path_info}") + logging.debug(f"✅ [{timestamp_end}] Completed {func_name} in {elapsed:.3f}s{path_info}") return result except Exception as e: elapsed = time.perf_counter() - start_time timestamp_end = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] - print(f"❌ [{timestamp_end}] Failed {func_name} after {elapsed:.3f}s{path_info}: {e}") + logging.debug(f"❌ [{timestamp_end}] Failed {func_name} after {elapsed:.3f}s{path_info}: {e}") raise return wrapper @@ -1626,7 +1626,7 @@ def read_stream( :param recompute_rels: If True, recompute all relationships after loading :return: an :class:`EPC` instance """ - print("Reading EPC file seq...") + logging.debug("Reading EPC file seq...") try: _read_files = [] obj_list = [] @@ -1779,7 +1779,7 @@ def read_stream_ultra_fast( from concurrent.futures import ProcessPoolExecutor, as_completed import multiprocessing - print("Reading EPC file parrallel v1...") + logging.debug("Reading EPC file parrallel v1...") obj_to_process = {} rels_to_process = {} @@ -1873,7 +1873,7 @@ def read_stream_ultra_fast_v2( ) -> Optional["Epc"]: from concurrent.futures import ThreadPoolExecutor # Passage au ThreadPool - print("Reading EPC file parrallel v2...") + logging.debug("Reading EPC file parrallel v2...") obj_list = [] path_to_obj = {} diff --git a/energyml-utils/src/energyml/utils/introspection.py b/energyml-utils/src/energyml/utils/introspection.py index e18d5a6..1128ac7 100644 --- a/energyml-utils/src/energyml/utils/introspection.py +++ b/energyml-utils/src/energyml/utils/introspection.py @@ -14,6 +14,11 @@ from enum import Enum from importlib import import_module from types import ModuleType + +try: + from types import UnionType # 'A | B' syntax, python >= 3.10 +except ImportError: + UnionType = () # isinstance(x, ()) is always False from typing import Any, List, Optional, Union, Dict, Tuple from energyml.utils.constants import ( @@ -42,6 +47,18 @@ from energyml.utils.constants import parse_content_type, ENERGYML_NAMESPACES, parse_qualified_type +def is_union_type(cls: Any) -> bool: + """ + Returns True if :param:`cls` is a union type : 'typing.Union[A, B]', 'typing.Optional[A]' or 'A | B'. + + Note: do not use 'isinstance(cls, typing.Union.__class__)' for that : since python 3.14, 'typing.Union' is + 'types.UnionType', thus 'typing.Union.__class__' is 'type' and the test is True for every class. + :param cls: + :return: bool + """ + return typing.get_origin(cls) is Union or isinstance(cls, UnionType) + + def is_enum(cls: Union[type, Any]): """ Returns True if :param:`cls` is an Enum @@ -603,7 +620,7 @@ def create_default_value_for_type(cls: Any): return False elif is_enum(cls): return cls[cls._member_names_[random.randint(0, len(cls._member_names_) - 1)]] - elif isinstance(cls, typing.Union.__class__): + elif is_union_type(cls): type_list = list(cls.__args__) if type(None) in type_list: type_list.remove(type(None)) # we don't want to generate none value @@ -1409,7 +1426,7 @@ def get_obj_pkg_pkgv_type_uuid_version( ct = get_object_attribute_no_verif(obj, "ContentType") except: pass - + if ct is not None: ct_match = parse_content_type(ct) if ct_match is not None: @@ -1425,7 +1442,7 @@ def get_obj_pkg_pkgv_type_uuid_version( qt = get_object_attribute_no_verif(obj, "QualifiedType") except: pass - + if qt is not None: qt_match = parse_qualified_type(qt) if qt_match is not None: @@ -1725,11 +1742,11 @@ def get_obj_attribute_class( return get_obj_attribute_class(chosen_type, None, random_for_typing) elif cls is not None: - if isinstance(cls, typing.Union.__class__): + if is_union_type(cls): type_list = list(cls.__args__) if type(None) in type_list: type_list.remove(type(None)) # we don't want to generate none value - chosen_type = type_list[random.randint(0, len(type_list))] + chosen_type = type_list[random.randint(0, len(type_list) - 1)] elif cls.__module__ == "typing": type_list = list(cls.__args__) if type(None) in type_list: @@ -1761,14 +1778,25 @@ def get_class_from_simple_name(simple_name: str, energyml_module_context=None) - try: return eval(simple_name) except NameError: + # Note: the imported names must be stored in an explicit namespace shared by the 'exec' and the 'eval' : + # since python 3.13 (PEP 667), 'locals()' returns an independent snapshot inside a function, so what + # 'exec' defines is not visible from the following 'eval'. + namespace = { + "List": List, + "Optional": Optional, + "Union": Union, + "Dict": Dict, + "Tuple": Tuple, + "Any": Any, + } for mod in energyml_module_context: try: - exec(f"from {mod} import *") + exec(f"from {mod} import *", namespace) # required to be able to access to type in # typing values like "List[ObjectAlias]" except ModuleNotFoundError: pass - return eval(simple_name) + return eval(simple_name, namespace) def _gen_str_from_attribute_name(attribute_name: Optional[str], _parent_class: Optional[type] = None) -> str: @@ -1837,6 +1865,21 @@ def random_value_from_class(cls: type): return None +def get_non_abstract_classes(cls: type, include_self: bool = True) -> List[type]: + """ + List all non abstract classes that can be instanciated for the type :param:`cls` : the class itself (if it is + not abstract and :param:`include_self` is True) and all its sub classes (recursively). + + Example : get_non_abstract_classes(energyml.eml.v2_3.commonv2.AbstractObject) + + :param cls: the (potentially abstract) class + :param include_self: if False, :param:`cls` is never returned, even if it is not abstract + :return: a list of non abstract classes (may be empty) + """ + potential_classes = ([cls] if include_self else []) + get_sub_classes(cls) + return list(dict.fromkeys(filter(lambda _c: not is_abstract(_c), potential_classes))) + + def get_all_possible_instanciable_classes( classes: Union[type, List[Any]], energyml_module_context: List[str] ) -> List[type]: @@ -1925,12 +1968,14 @@ def _random_value_from_class( return random.randint(0, 1) == 1 elif is_enum(cls): return cls[cls._member_names_[random.randint(0, len(cls._member_names_) - 1)]] - elif isinstance(cls, typing.Union.__class__): + elif is_union_type(cls): type_list = list(cls.__args__) if type(None) in type_list: type_list.remove(type(None)) # we don't want to generate none value - chosen_type = type_list[random.randint(0, len(type_list))] - return _random_value_from_class(chosen_type, energyml_module_context, attribute_name, cls) + chosen_type = type_list[random.randint(0, len(type_list) - 1)] + # '_parent_class' must stay the real parent class (not the union alias) : it is used to generate + # coherent values for attributes like 'title', 'qualified_type' or 'schema_version' + return _random_value_from_class(chosen_type, energyml_module_context, attribute_name, _parent_class) elif cls.__module__ == "typing": type_list = list(cls.__args__) if type(None) in type_list: diff --git a/energyml-utils/validation_drogon22_extras.txt b/energyml-utils/validation_drogon22_extras.txt new file mode 100644 index 0000000000000000000000000000000000000000..45e665bc288e31a3f478a106d04551002d84c2cd GIT binary patch literal 3923886 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 literal 0 HcmV?d00001 From 626be87ee94d2718c441adafbbb24f24acb1446b Mon Sep 17 00:00:00 2001 From: Valentin Gauthier Date: Wed, 29 Jul 2026 16:17:11 +0200 Subject: [PATCH 02/14] wgs84 working --- energyml-utils/README.md | 81 ++++- energyml-utils/example/tools.py | 12 + energyml-utils/pyproject.toml | 4 + energyml-utils/src/energyml/utils/data/crs.py | 253 ++++++++++++- .../src/energyml/utils/data/export.py | 286 +++++++++++++-- .../src/energyml/utils/data/mesh.py | 341 +++++++++++++++--- .../src/energyml/utils/introspection.py | 61 ++++ energyml-utils/tests/test_geojson_export.py | 218 +++++++++++ 8 files changed, 1158 insertions(+), 98 deletions(-) create mode 100644 energyml-utils/tests/test_geojson_export.py diff --git a/energyml-utils/README.md b/energyml-utils/README.md index 8e66137..36beed0 100644 --- a/energyml-utils/README.md +++ b/energyml-utils/README.md @@ -270,7 +270,7 @@ The EpcStreamReader is perfect for applications that need to work with large EPC # Poetry scripts : -- extract_3d : extract a representation into an 3D file (obj/off) +- extract_3d : extract a representation into an 3D file (obj/off/geojson) - csv_to_dataset : translate csv data into h5 dataset - generate_data : generate a random data from a qualified_type - xml_to_json : translate an energyml xml file into json. @@ -355,6 +355,85 @@ Extract to OFF format without CRS displacement: poetry run extract_3d --epc "path/to/file.epc" --output "output_folder" --file-format OFF --no-crs ``` +### Extract 3D Representations as GeoJSON + +Export every exportable representation of the EPC to GeoJSON (one `.geojson` file per +representation; a representation that cannot be read is logged and skipped): +```bash +poetry run extract_3d --epc "path/to/file.epc" --output "output_folder" --file-format geojson +``` + +Export only some representations: +```bash +poetry run extract_3d --epc "path/to/file.epc" --output "output_folder" --file-format geojson --uuid "uuid1" "uuid2" +``` + +**Coordinates are reprojected to WGS84 by default**, as required by [RFC 7946](https://www.rfc-editor.org/rfc/rfc7946). +This needs the `crs` extra: +```bash +poetry install --extras crs # or : pip install energyml-utils[crs] +``` + +Without it (or when no EPSG code can be found in the CRS), a warning is logged, the coordinates are +left in their source CRS, and that CRS is advertised in the output through the `crs` (GeoJSON 2008, +read by GDAL / QGIS) and `coordRefSys` (OGC JSON-FG) members. + +Keep the coordinates in the source projected CRS: +```bash +poetry run extract_3d --epc "path/to/file.epc" --output "output_folder" --file-format geojson --no-wgs84 +``` + +Allow PROJ to download the geoid grids used by the vertical datum transformation. Without them the +height conversion is silently skipped, which can be off by tens of metres: +```bash +poetry run extract_3d --epc "path/to/file.epc" --output "output_folder" --file-format geojson --proj-network +``` + +Each feature carries the identification metadata of its source object: the energyml `uuid` in the +RFC 7946 `id` member, and the `uuid`, `qualified_type`, `content_type`, ETP `uri`, `Citation` fields +(title, originator, creation, last_update, …) and EPSG codes in `properties`: + +```json +{ + "type": "FeatureCollection", + "name": "Bartonien Top", + "bbox": [2.3675, 48.9129, 30.13, 2.4057, 48.9198, 37.15], + "features": [ + { + "type": "Feature", + "id": "02cc9411-6b90-4619-a9fd-a39ac332b367", + "properties": { + "uuid": "02cc9411-6b90-4619-a9fd-a39ac332b367", + "qualified_type": "resqml22.PointSetRepresentation", + "uri": "eml:///resqml22.PointSetRepresentation(02cc9411-6b90-4619-a9fd-a39ac332b367)", + "title": "Bartonien Top", + "originator": "Geosiris", + "creation": "2025-12-17T16:11:36Z", + "last_update": "2025-12-17T16:11:36Z", + "projected_epsg_code": 3949, + "source_crs": "EPSG:3949", + "coordinates_crs": "OGC:CRS84" + }, + "geometry": { "type": "MultiPoint", "coordinates": [[2.4055336, 48.9140288, 37.15]] } + } + ] +} +``` + +The same options are available from python: +```python +from energyml.utils.data.mesh import MeshFileFormat, export_multiple_data + +export_multiple_data( + epc_path="path/to/file.epc", + uuid_list=["uuid1"], + output_folder_path="output_folder", + file_format=MeshFileFormat.GEOJSON, + to_wgs84=True, # default + use_network=False, # True to download the geoid grids +) +``` + ### CSV to Dataset Convert CSV to HDF5: diff --git a/energyml-utils/example/tools.py b/energyml-utils/example/tools.py index 1592712..11a8f1b 100644 --- a/energyml-utils/example/tools.py +++ b/energyml-utils/example/tools.py @@ -560,6 +560,16 @@ def extract_representation_in_3d_file(): help=f"Type of the output files (one of : {[e.value for e in MeshFileFormat]}). Default is 'obj'", ) parser.add_argument("--uuid", "-u", type=str, help="The uuids of representations to extract", nargs="+") + parser.add_argument( + "--no-wgs84", + action="store_true", + help="GeoJSON only : keep the coordinates in their source CRS instead of reprojecting them to WGS84", + ) + parser.add_argument( + "--proj-network", + action="store_true", + help="GeoJSON only : allow PROJ to download the geoid grids needed by the vertical datum transformation", + ) args = parser.parse_args() @@ -569,6 +579,8 @@ def extract_representation_in_3d_file(): output_folder_path=args.output, file_format=args.file_format, use_crs_displacement=not args.no_crs, + to_wgs84=not args.no_wgs84, + use_network=args.proj_network, ) diff --git a/energyml-utils/pyproject.toml b/energyml-utils/pyproject.toml index ac7de7c..f269bb6 100644 --- a/energyml-utils/pyproject.toml +++ b/energyml-utils/pyproject.toml @@ -63,6 +63,7 @@ hdf5 = ["h5py"] las = ["lasio"] segy = ["segyio"] geometry = ["scipy"] +crs = ["pyproj"] [tool.poetry.dependencies] python = "^3.9" @@ -75,6 +76,9 @@ pyarrow = { version = "^14.0.1", optional = true } pandas = { version = "^1.1.0", optional = true } lasio = { version = "^0.31", optional = true } segyio = { version = "^1.9", optional = true } +# CRS reprojection (WGS84). pyproj >=3.7 requires python >=3.10, so keep a loose constraint +# and let the resolver pick 3.6.x on python 3.9. +pyproj = { version = ">=3.4", optional = true } [tool.poetry.group.dev.dependencies] coverage = {extras = ["toml"], version = "^6.2"} diff --git a/energyml-utils/src/energyml/utils/data/crs.py b/energyml-utils/src/energyml/utils/data/crs.py index df74355..571ec67 100644 --- a/energyml-utils/src/energyml/utils/data/crs.py +++ b/energyml-utils/src/energyml/utils/data/crs.py @@ -24,6 +24,7 @@ import logging import math from dataclasses import dataclass, field +from functools import lru_cache from typing import Any, Optional import numpy as np @@ -106,11 +107,10 @@ class CrsInfo: vertical_unknown: Optional[str] = None """Free-text vertical CRS descriptor.""" - + time_uom: Optional[str] = None """Unit of measure for time coordinates (e.g. ``"s"``, ``"min"``, ``"h"``).""" - # ------------------------------------------------------------------ # Rotation / azimuth # ------------------------------------------------------------------ @@ -575,6 +575,25 @@ def _from_local_engineering2d_crs( ) +def _from_projected_crs(crs_obj: Any) -> CrsInfo: + """ + Handle a standalone ``ProjectedCrs`` document object — **EML v2.3 / RESQML v2.2**. + + Such an object carries no local offset / rotation (those live in the + ``LocalEngineering2dCrs``); only the EPSG code, the UOM and the axis order are available. + """ + type_name = type(crs_obj).__name__ + details = _extract_projected_crs_details(crs_obj) + return CrsInfo( + projected_epsg_code=details.get("epsg_code"), + projected_uom=details.get("uom"), + projected_axis_order=details.get("axis_order"), + projected_wkt=details.get("wkt"), + projected_unknown=details.get("unknown"), + source_type=type_name, + ) + + def _from_vertical_crs(crs_obj: Any) -> CrsInfo: """ Handle a standalone ``VerticalCrs`` document object — **EML v2.3 / RESQML v2.2**. @@ -627,7 +646,7 @@ def _from_local_engineering_compound_crs( vert_axis_uom_raw = get_object_attribute(crs_obj, "vertical_axis.uom") if vert_axis_uom_raw is not None: vert_axis_uom = _uom_to_str(vert_axis_uom_raw) - + is_time = get_object_attribute(crs_obj, "vertical_axis.is_time") time_uom = None if is_time is not None and str(is_time).lower() in ("true", "1", "yes"): @@ -856,6 +875,209 @@ def apply_from_crs_info( return pts +# --------------------------------------------------------------------------- +# WGS84 reprojection (requires the 'crs' extra : pyproj) +# --------------------------------------------------------------------------- + +#: EPSG code of WGS84 as a 2D geographic CRS (longitude, latitude). +WGS84_2D_EPSG_CODE = 4326 + +#: EPSG code of WGS84 as a 3D geographic CRS (longitude, latitude, ellipsoidal height). +#: This is the target to use whenever a vertical CRS is known, since EPSG:4326 carries no height. +WGS84_3D_EPSG_CODE = 4979 + + +def crs_ogc_uri(epsg_code: int) -> str: + """ + Return the OGC URI of an EPSG code, e.g. ``http://www.opengis.net/def/crs/EPSG/0/32631``. + + This is the identifier form used by OGC API - Features and by JSON-FG ``coordRefSys`` + members, and is the standard way to advertise a CRS in a GeoJSON-like document. + """ + return f"http://www.opengis.net/def/crs/EPSG/0/{int(epsg_code)}" + + +def crs_urn(epsg_code: int) -> str: + """ + Return the OGC URN of an EPSG code, e.g. ``urn:ogc:def:crs:EPSG::32631``. + + This is the form used by the (deprecated but still widely supported by GDAL / QGIS) + GeoJSON 2008 ``crs`` member. + """ + return f"urn:ogc:def:crs:EPSG::{int(epsg_code)}" + + +def is_pyproj_available() -> bool: + """Return ``True`` when :mod:`pyproj` (the ``crs`` extra) can be imported.""" + try: + import pyproj # noqa: F401 + + return True + except ImportError: + return False + + +def build_source_crs_id( + projected_epsg_code: Optional[int], + vertical_epsg_code: Optional[int] = None, +) -> Optional[str]: + """ + Build the CRS identifier to hand over to pyproj. + + Returns ``"EPSG:+EPSG:"`` (compound CRS) when a vertical code is given, + ``"EPSG:"`` when only the horizontal one is known, and ``None`` when no + horizontal code is available (nothing can be reprojected in that case). + """ + if projected_epsg_code is None: + return None + if vertical_epsg_code is not None: + return f"EPSG:{int(projected_epsg_code)}+EPSG:{int(vertical_epsg_code)}" + return f"EPSG:{int(projected_epsg_code)}" + + +@lru_cache(maxsize=32) +def _get_transformer(source_crs_id: str, target_epsg_code: int, network_enabled: bool = False): + """ + Build (and cache) a pyproj ``Transformer``. Building one costs a few ms, reuse is free. + + ``network_enabled`` is part of the cache key on purpose: PROJ selects the transformation + pipeline when the transformer is built, so a transformer created while the network was + disabled would keep ignoring the geoid grids even after the network is turned on. + """ + from pyproj import Transformer + + # always_xy=True : force the (longitude, latitude) order on output, whatever the + # axis order declared by the EPSG registry (EPSG:4326 is officially lat/lon). + return Transformer.from_crs(source_crs_id, f"EPSG:{int(target_epsg_code)}", always_xy=True) + + +@lru_cache(maxsize=32) +def _vertical_axis_is_down(vertical_epsg_code: int) -> bool: + """ + Return ``True`` when the vertical CRS counts positive values *downward* (a depth CRS, + e.g. EPSG:5715 "MSL depth"), ``False`` for a height CRS (e.g. EPSG:5714 "MSL height"). + """ + try: + from pyproj import CRS + + for axis in CRS.from_epsg(int(vertical_epsg_code)).axis_info: + if (axis.direction or "").lower() == "down": + return True + except Exception as exc: + logger.debug("Cannot determine the axis direction of EPSG:%s : %s", vertical_epsg_code, exc) + return False + + +def reproject_to_wgs84( + points: np.ndarray, + crs_info: Optional["CrsInfo"] = None, + *, + projected_epsg_code: Optional[int] = None, + vertical_epsg_code: Optional[int] = None, + z_is_up: bool = True, + use_network: bool = False, + inplace: bool = False, +) -> np.ndarray: + """ + Reproject *points* from their projected CRS to WGS84 (longitude, latitude, ellipsoidal height). + + The input points are expected to be **already expressed in the projected CRS**, i.e. + :func:`apply_from_crs_info` must have been applied first (offsets, rotation, …). + + Parameters + ---------- + points: + ``(N, 3)`` array in the source projected CRS. + crs_info: + Source :class:`CrsInfo`; its EPSG codes are used unless overridden by the + *projected_epsg_code* / *vertical_epsg_code* parameters. + projected_epsg_code, vertical_epsg_code: + Explicit EPSG codes, taking precedence over *crs_info*. + z_is_up: + ``True`` (default) when the Z column holds heights counted upward — which is what + :func:`apply_from_crs_info` produces. When the vertical CRS is a *depth* CRS the Z + sign is flipped accordingly before the transformation. + use_network: + When ``True``, allow PROJ to download the geoid / datum grids it needs from the PROJ + CDN. **Without them a vertical datum transformation silently does nothing** (it can + be off by tens of metres), so a warning is emitted when a vertical CRS is requested + while the network is disabled. + inplace: + When ``True`` the result is written back into *points*. + + Returns + ------- + np.ndarray + ``(N, 3)`` array of ``[longitude, latitude, height]``. + + Raises + ------ + MissingExtraInstallation + When :mod:`pyproj` is not installed (``pip install energyml-utils[crs]``). + NotEnoughInformationError + When no horizontal EPSG code is available. + """ + from energyml.utils.exception import MissingExtraInstallation, NotEnoughInformationError + + if projected_epsg_code is None and crs_info is not None: + projected_epsg_code = crs_info.projected_epsg_code + if vertical_epsg_code is None and crs_info is not None: + vertical_epsg_code = crs_info.vertical_epsg_code + + source_crs_id = build_source_crs_id(projected_epsg_code, vertical_epsg_code) + if source_crs_id is None: + raise NotEnoughInformationError( + "Cannot reproject to WGS84: no projected (horizontal) EPSG code found in the CRS object." + ) + + if not is_pyproj_available(): + raise MissingExtraInstallation("crs") + + import pyproj + + pts = np.asarray(points, dtype=np.float64).reshape(-1, 3) + + if vertical_epsg_code is not None: + if not use_network and not pyproj.network.is_network_enabled(): + logger.warning( + "reproject_to_wgs84: vertical CRS EPSG:%s requested while the PROJ network is disabled — " + "the geoid grid may be missing and the vertical transformation silently skipped. " + "Pass use_network=True (or install the grids) for an accurate height.", + vertical_epsg_code, + ) + if z_is_up and _vertical_axis_is_down(vertical_epsg_code): + # The vertical CRS counts depths (positive down) but Z holds heights: flip it back. + pts = pts.copy() + pts[:, 2] = -pts[:, 2] + + if crs_info is not None and crs_info.time_uom is not None: + logger.warning( + "reproject_to_wgs84: the source CRS is a time-based CRS (time_uom='%s'); " + "the Z column is a time, not a height — its reprojection is meaningless.", + crs_info.time_uom, + ) + + network_was_enabled = pyproj.network.is_network_enabled() + if use_network and not network_was_enabled: + pyproj.network.set_network_enabled(True) + try: + transformer = _get_transformer(source_crs_id, WGS84_3D_EPSG_CODE, use_network or network_was_enabled) + if len(pts) == 1: + # pyproj takes its scalar code path for a 1-element array (and numpy warns about it) + lon, lat, height = transformer.transform(float(pts[0, 0]), float(pts[0, 1]), float(pts[0, 2])) + else: + lon, lat, height = transformer.transform(pts[:, 0], pts[:, 1], pts[:, 2]) + finally: + if use_network and not network_was_enabled: + pyproj.network.set_network_enabled(False) + + result = points if inplace else np.empty((len(pts), 3), dtype=np.float64) + result[:, 0] = lon + result[:, 1] = lat + result[:, 2] = height + return result + + # --------------------------------------------------------------------------- # Public factory # --------------------------------------------------------------------------- @@ -926,6 +1148,9 @@ def extract_crs_info( if type_name_lower == "verticalcrs": return _from_vertical_crs(crs_obj) + if type_name_lower == "projectedcrs": + return _from_projected_crs(crs_obj) + # ------------------------------------------------------------------ # v2.0.1 types (LocalDepth3dCrs, LocalTime3dCrs, AbstractLocal3dCrs) # ------------------------------------------------------------------ @@ -951,6 +1176,21 @@ def extract_crs_info( ) return _from_local_engineering2d_crs(crs_obj, workspace) + # v2.2 pattern: has AbstractProjectedCrs / AbstractVerticalCrs → standalone CRS document + if get_object_attribute_rgx(crs_obj, "[Aa]bstract[Pp]rojected[Cc]rs") is not None: + logger.debug( + "extract_crs_info: unrecognised type '%s' — treating as ProjectedCrs (v2.2 pattern).", + type(crs_obj).__name__, + ) + return _from_projected_crs(crs_obj) + + if get_object_attribute_rgx(crs_obj, "[Aa]bstract[Vv]ertical[Cc]rs") is not None: + logger.debug( + "extract_crs_info: unrecognised type '%s' — treating as VerticalCrs (v2.2 pattern).", + type(crs_obj).__name__, + ) + return _from_vertical_crs(crs_obj) + # v2.2 pattern: has LocalEngineering2dCrs DOR → compound if get_object_attribute_rgx(crs_obj, "[Ll]ocal[Ee]ngineering2[dD][Cc]rs") is not None: logger.debug( @@ -971,4 +1211,11 @@ def extract_crs_info( "extract_crs_info", "apply_from_crs_info", "apply_axis_order_swap", + "reproject_to_wgs84", + "build_source_crs_id", + "is_pyproj_available", + "crs_ogc_uri", + "crs_urn", + "WGS84_2D_EPSG_CODE", + "WGS84_3D_EPSG_CODE", ] diff --git a/energyml-utils/src/energyml/utils/data/export.py b/energyml-utils/src/energyml/utils/data/export.py index 3c58576..6610deb 100644 --- a/energyml-utils/src/energyml/utils/data/export.py +++ b/energyml-utils/src/energyml/utils/data/export.py @@ -148,13 +148,39 @@ def binary(self) -> bool: class GeoJSONExportOptions(ExportOptions): """Options for GeoJSON export.""" - def __init__(self, indent: Optional[int] = 2, properties: Optional[dict] = None): + def __init__( + self, + indent: Optional[int] = 2, + properties: Optional[dict] = None, + to_wgs84: bool = True, + include_metadata: bool = True, + use_network: bool = False, + projected_epsg_code: Optional[int] = None, + vertical_epsg_code: Optional[int] = None, + ): """ :param indent: JSON indentation level (None for compact output). :param properties: Extra properties merged into every feature. + :param to_wgs84: When True (default), coordinates are reprojected to WGS84 + (longitude, latitude, ellipsoidal height) as required by RFC 7946. + Silently disabled when no EPSG code can be found or when ``pyproj`` + (extra ``crs``) is not installed — the source CRS is then advertised + in the output instead. + :param include_metadata: When True (default), the ``uuid``, ``qualified_type`` and + ``Citation`` fields of the source object are written in the + properties of every feature. + :param use_network: Allow PROJ to download the geoid grids needed by vertical datum + transformations. Without them the height conversion is skipped. + :param projected_epsg_code: Force the horizontal EPSG code instead of reading it from the CRS. + :param vertical_epsg_code: Force the vertical EPSG code instead of reading it from the CRS. """ self.indent = indent self.properties = properties or {} + self.to_wgs84 = to_wgs84 + self.include_metadata = include_metadata + self.use_network = use_network + self.projected_epsg_code = projected_epsg_code + self.vertical_epsg_code = vertical_epsg_code # --------------------------------------------------------------------------- @@ -399,6 +425,136 @@ def export_obj( # --------------------------------------------------------------------------- +def _geojson_crs_members( + projected_epsg_code: Optional[int], + vertical_epsg_code: Optional[int], +) -> dict: + """ + Build the members advertising a **non-WGS84** CRS in a GeoJSON document. + + RFC 7946 mandates WGS84 (CRS84) and removed the ``crs`` member, so when the coordinates + are left in their projected CRS the document is, strictly speaking, non conformant. + Two complementary standard-ish identifiers are then written: + + - ``crs`` — the GeoJSON 2008 named-CRS member. Deprecated, but it is what GDAL / OGR + and QGIS actually read. + - ``coordRefSys`` — the OGC JSON-FG member, given as OGC URI(s). A list is used for a + compound CRS (horizontal + vertical), as allowed by JSON-FG. + + Returns an empty dict when no EPSG code is available. + """ + if projected_epsg_code is None: + return {} + + from energyml.utils.data.crs import crs_ogc_uri, crs_urn + + members: dict = { + "crs": {"type": "name", "properties": {"name": crs_urn(projected_epsg_code)}}, + } + if vertical_epsg_code is not None: + members["coordRefSys"] = [crs_ogc_uri(projected_epsg_code), crs_ogc_uri(vertical_epsg_code)] + else: + members["coordRefSys"] = crs_ogc_uri(projected_epsg_code) + return members + + +def _feature_id( + source_uuid: Optional[str], + patch_index: Optional[int] = None, + element_index: Optional[int] = None, +) -> Optional[str]: + """ + Build the RFC 7946 ``id`` member of a feature (§3.2 : "If a Feature has a commonly used + identifier, that identifier SHOULD be included"). The energyml uuid is used, suffixed by + the patch / element indices when a single object yields several features. + """ + if not source_uuid: + return None + parts = [source_uuid] + if patch_index is not None: + parts.append(str(patch_index)) + if element_index is not None: + parts.append(str(element_index)) + return "_".join(parts) + + +def _geojson_bbox(all_points: List[np.ndarray]) -> Optional[List[float]]: + """ + Compute the RFC 7946 §5 ``bbox`` of the whole collection : + ``[min_x, min_y, min_z, max_x, max_y, max_z]``. + """ + non_empty = [p for p in all_points if p is not None and len(p) > 0] + if not non_empty: + return None + stacked = np.concatenate([np.asarray(p, dtype=np.float64).reshape(-1, 3) for p in non_empty], axis=0) + mins = stacked.min(axis=0) + maxs = stacked.max(axis=0) + return [float(mins[0]), float(mins[1]), float(mins[2]), float(maxs[0]), float(maxs[1]), float(maxs[2])] + + +def _prepare_geojson_points( + mesh: Any, + pts: np.ndarray, + options: "GeoJSONExportOptions", + workspace: Any, +) -> tuple: + """ + Reproject *pts* to WGS84 when possible and return + ``(points, projected_epsg_code, vertical_epsg_code, is_wgs84)``. + + Falls back silently (with a warning) to the source coordinates when the EPSG codes are + unknown, when ``pyproj`` is missing, or when the transformation fails. + """ + from energyml.utils.data.crs import extract_crs_info, is_pyproj_available, reproject_to_wgs84 + + projected_epsg_code = options.projected_epsg_code + vertical_epsg_code = options.vertical_epsg_code + crs_info = None + + crs_obj = getattr(mesh, "crs_object", None) + if isinstance(crs_obj, list): + crs_obj = crs_obj[0] if crs_obj else None + if crs_obj is not None: + try: + crs_info = extract_crs_info(crs_obj, workspace) + except Exception as exc: # pragma: no cover — extract_crs_info is already defensive + log.debug("CRS info extraction failed: %s", exc) + + if crs_info is not None: + projected_epsg_code = projected_epsg_code or crs_info.projected_epsg_code + vertical_epsg_code = vertical_epsg_code or crs_info.vertical_epsg_code + + if not options.to_wgs84 or projected_epsg_code is None or len(pts) == 0: + if options.to_wgs84 and projected_epsg_code is None: + log.warning( + "GeoJSON export: no projected EPSG code found for %s — coordinates are left in " + "their source CRS (non RFC 7946 conformant).", + getattr(mesh, "source_uuid", None) or getattr(mesh, "identifier", "?"), + ) + return pts, projected_epsg_code, vertical_epsg_code, False + + if not is_pyproj_available(): + log.warning( + "GeoJSON export: pyproj is not installed (pip install energyml-utils[crs]) — " + "coordinates are left in EPSG:%s instead of WGS84.", + projected_epsg_code, + ) + return pts, projected_epsg_code, vertical_epsg_code, False + + try: + reprojected = reproject_to_wgs84( + pts, + crs_info, + projected_epsg_code=projected_epsg_code, + vertical_epsg_code=vertical_epsg_code, + use_network=options.use_network, + ) + return reprojected, projected_epsg_code, vertical_epsg_code, True + except Exception as exc: + log.warning("GeoJSON export: reprojection to WGS84 failed (%s) — keeping the source coordinates.", exc) + return pts, projected_epsg_code, vertical_epsg_code, False + + def export_geojson( mesh_list: Any, out: TextIO, @@ -408,6 +564,15 @@ def export_geojson( ) -> None: """Export mesh data to GeoJSON FeatureCollection. + Coordinates are reprojected to WGS84 (longitude, latitude, ellipsoidal height) by default, + as required by RFC 7946 — see :class:`GeoJSONExportOptions`. When the reprojection cannot + be done, the source CRS is advertised through the ``crs`` (GeoJSON 2008) and + ``coordRefSys`` (OGC JSON-FG) members instead. + + Every feature carries the identification metadata of its source object : the RFC 7946 + ``id`` member holds the energyml uuid, and ``properties`` holds the ``uuid``, + ``qualified_type`` and ``Citation`` fields (title, creation, last_update, …). + :param mesh_list: One or more meshes. :param out: Text output stream. :param options: GeoJSON export options. @@ -416,6 +581,7 @@ def export_geojson( """ from energyml.utils.data.mesh import PolylineSetMesh, SurfaceMesh from energyml.utils.data.mesh_numpy import NumpyMesh, NumpyPointSetMesh, NumpyPolylineMesh + from energyml.utils.introspection import get_object_metadata if options is None: options = GeoJSONExportOptions() @@ -423,57 +589,76 @@ def export_geojson( patches = _normalize_to_patches(mesh_list) workspace = _workspace_from_contexts(contexts) features: List[dict] = [] + exported_points: List[np.ndarray] = [] + #: (projected_epsg, vertical_epsg, is_wgs84) of every patch — used to declare the CRS. + crs_states: set = set() for mesh in patches: pts = _get_export_points(mesh, use_crs_displacement, workspace) + pts, projected_epsg_code, vertical_epsg_code, is_wgs84 = _prepare_geojson_points( + mesh, np.asarray(pts, dtype=np.float64).reshape(-1, 3), options, workspace + ) + crs_states.add((projected_epsg_code, vertical_epsg_code, is_wgs84)) + exported_points.append(pts) + source_uuid = getattr(mesh, "source_uuid", None) patch_idx = getattr(mesh, "patch_index", None) color = _get_context_color(source_uuid, contexts) - base_props: dict = { - **options.properties, - "source_uuid": source_uuid, - "patch_index": patch_idx, - } + + base_props: dict = {**options.properties} + if options.include_metadata: + base_props.update(get_object_metadata(getattr(mesh, "energyml_object", None))) + base_props["source_uuid"] = source_uuid or base_props.get("uuid") + base_props["patch_index"] = patch_idx + if projected_epsg_code is not None: + base_props["projected_epsg_code"] = projected_epsg_code + if vertical_epsg_code is not None: + base_props["vertical_epsg_code"] = vertical_epsg_code + if is_wgs84: + # keep the provenance of the coordinates now that they have been converted + base_props["source_crs"] = f"EPSG:{projected_epsg_code}" + base_props["coordinates_crs"] = "OGC:CRS84" if color: r, g, b, a = color base_props["color"] = f"#{r:02x}{g:02x}{b:02x}" base_props["opacity"] = round(a / 255.0, 4) + def _feature(geometry: dict, element_index: Optional[int] = None, extra: Optional[dict] = None) -> dict: + feature: dict = {"type": "Feature"} + feature_id = _feature_id(source_uuid, patch_idx, element_index) + if feature_id is not None: + feature["id"] = feature_id + feature["geometry"] = geometry + feature["properties"] = base_props if extra is None else {**base_props, **extra} + return feature + if isinstance(mesh, NumpyMesh): if isinstance(mesh, NumpyPointSetMesh): - coords = pts.tolist() - features.append( - { - "type": "Feature", - "geometry": {"type": "MultiPoint", "coordinates": coords}, - "properties": base_props, - } - ) + features.append(_feature({"type": "MultiPoint", "coordinates": pts.tolist()})) elif isinstance(mesh, NumpyPolylineMesh): - for seg in _parse_vtk_flat_lines(mesh.lines): + for seg_idx, seg in enumerate(_parse_vtk_flat_lines(mesh.lines)): if len(seg) < 2: continue - coords = pts[seg].tolist() features.append( - { - "type": "Feature", - "geometry": {"type": "LineString", "coordinates": coords}, - "properties": base_props, - } + _feature( + {"type": "LineString", "coordinates": pts[seg].tolist()}, + element_index=seg_idx, + extra={"element_index": seg_idx}, + ) ) else: # NumpySurfaceMesh / NumpyVolumeMesh - for face in _parse_vtk_flat_faces(_get_faces_or_cells(mesh)): + for face_idx, face in enumerate(_parse_vtk_flat_faces(_get_faces_or_cells(mesh))): if len(face) < 3: continue coords = pts[face].tolist() coords.append(coords[0]) # close ring features.append( - { - "type": "Feature", - "geometry": {"type": "Polygon", "coordinates": [coords]}, - "properties": base_props, - } + _feature( + {"type": "Polygon", "coordinates": [coords]}, + element_index=face_idx, + extra={"element_index": face_idx}, + ) ) else: # AbstractMesh legacy path @@ -482,28 +667,49 @@ def export_geojson( if isinstance(mesh, PolylineSetMesh): if len(elem) < 2: continue - coords = [list(pts[i]) for i in elem] + # .tolist() : json.dump does not accept numpy scalars + coords = pts[np.asarray(elem, dtype=np.int64)].tolist() features.append( - { - "type": "Feature", - "geometry": {"type": "LineString", "coordinates": coords}, - "properties": {**base_props, "element_index": elem_idx}, - } + _feature( + {"type": "LineString", "coordinates": coords}, + element_index=elem_idx, + extra={"element_index": elem_idx}, + ) ) elif isinstance(mesh, SurfaceMesh): if len(elem) < 3: continue - coords = [list(pts[i]) for i in elem] + coords = pts[np.asarray(elem, dtype=np.int64)].tolist() coords.append(coords[0]) features.append( - { - "type": "Feature", - "geometry": {"type": "Polygon", "coordinates": [coords]}, - "properties": {**base_props, "element_index": elem_idx}, - } + _feature( + {"type": "Polygon", "coordinates": [coords]}, + element_index=elem_idx, + extra={"element_index": elem_idx}, + ) ) - json.dump({"type": "FeatureCollection", "features": features}, out, indent=options.indent) + collection: dict = {"type": "FeatureCollection"} + + # Advertise the CRS only when the coordinates are NOT WGS84 : an RFC 7946 document is + # implicitly in CRS84 and must not carry a 'crs' member. + not_wgs84 = [state for state in crs_states if not state[2]] + if len(not_wgs84) == 1: + collection.update(_geojson_crs_members(not_wgs84[0][0], not_wgs84[0][1])) + elif len(not_wgs84) > 1: + log.warning( + "GeoJSON export: %d different source CRS in the same FeatureCollection — " + "no collection-level CRS is declared, see the per-feature 'projected_epsg_code' property.", + len(not_wgs84), + ) + + bbox = _geojson_bbox(exported_points) + if bbox is not None: + collection["bbox"] = bbox + + collection["features"] = features + + json.dump(collection, out, indent=options.indent) # --------------------------------------------------------------------------- diff --git a/energyml-utils/src/energyml/utils/data/mesh.py b/energyml-utils/src/energyml/utils/data/mesh.py index 6e3ebc7..ab488e8 100644 --- a/energyml-utils/src/energyml/utils/data/mesh.py +++ b/energyml-utils/src/energyml/utils/data/mesh.py @@ -26,12 +26,18 @@ get_crs_obj, read_parametric_geometry, ) -from energyml.utils.data.crs import extract_crs_info, apply_from_crs_info +from energyml.utils.data.crs import ( + extract_crs_info, + apply_from_crs_info, + is_pyproj_available, + reproject_to_wgs84, +) from energyml.utils.epc_utils import gen_energyml_object_path from energyml.utils.epc_stream import EpcStreamReader from energyml.utils.exception import NotSupportedError, ObjectNotFoundNotError from energyml.utils.introspection import ( get_obj_uri, + get_object_metadata, search_attribute_matching_name, search_attribute_matching_name_with_path, snake_case, @@ -43,6 +49,7 @@ # Import export functions from new export module for backward compatibility from energyml.utils.data.export import export_obj as _export_obj_new +from energyml.utils.data.export import _geojson_crs_members _FILE_HEADER: bytes = b"# file exported by energyml-utils python module (Geosiris)\n" @@ -1627,32 +1634,55 @@ def _write_geojson_shape( if _print_list_boundaries: out.write(b"]") except Exception as e: - if logger is not None: - logger.error(e) + # never swallow silently: a failure here produces a geometry without coordinates + (logger or logging).error( + f"@_write_geojson_shape failed for a {geo_type.name} geometry: {type(e).__name__}: {e}" + ) # raise e return mins, maxs +def _as_json_ready_list(value: Any) -> Any: + """ + Convert numpy arrays / numpy scalars into plain python lists and floats. + + The GeoJSON writers below serialize the points with :func:`json.dumps`, which does not + support numpy types : depending on the representation and on the way its points were read, + ``AbstractMesh.point_list`` may be a ``list`` *or* an ``ndarray``. Without this conversion + the serialization raises ``TypeError: Object of type ndarray is not JSON serializable``. + """ + if isinstance(value, np.ndarray): + return value.tolist() + if isinstance(value, np.generic): + return value.item() + if isinstance(value, (list, tuple)): + return [_as_json_ready_list(v) for v in value] + return value + + def to_geojson_feature( mesh: AbstractMesh, geo_type: GeoJsonGeometryType = GeoJsonGeometryType.Point, - geo_type_prefix: Optional[str] = "AnyCrs", + geo_type_prefix: Optional[str] = "", properties: Optional[dict] = None, point_offset: int = 0, logger=None, + feature_id: Optional[str] = None, ) -> Dict: + """ + Build a GeoJSON Feature as a dict. + + :param geo_type_prefix: prefix of the ``type`` member. Empty (default) for a standard + RFC 7946 ``"Feature"``; ``"AnyCrs"`` marks non-WGS84 coordinates. + :param feature_id: value of the RFC 7946 ``id`` member (the energyml uuid, typically). + """ feature = {} if mesh.point_list is not None and len(mesh.point_list) > 0: - points = mesh.point_list - - # TODO: remove : - # points = list(map( - # lambda p: list(map(lambda x: round(x/10000., 4), p)), - # mesh.point_list - # )) + # point_list / indices may be numpy arrays : json.dumps only accepts plain python types + points = _as_json_ready_list(mesh.point_list) - indices = mesh.get_indices() + indices = _as_json_ready_list(mesh.get_indices()) # polygon must have the first and last point as the same if geo_type == GeoJsonGeometryType.Polygon or geo_type == GeoJsonGeometryType.MultiPolygon: if logger is not None: @@ -1694,11 +1724,11 @@ def to_geojson_feature( "bbox": bbox_geometry, } - feature = { - "type": f"{geo_type_prefix}Feature", - "properties": properties or {}, - "geometry": geometry, - } + feature = {"type": f"{geo_type_prefix or ''}Feature"} + if feature_id is not None: + feature["id"] = feature_id + feature["properties"] = properties or {} + feature["geometry"] = geometry return feature @@ -1707,15 +1737,25 @@ def write_geojson_feature( out: BytesIO, mesh: AbstractMesh, geo_type: GeoJsonGeometryType = GeoJsonGeometryType.Point, - geo_type_prefix: Optional[str] = "AnyCrs", + geo_type_prefix: Optional[str] = "", properties: Optional[dict] = None, point_offset: int = 0, logger=None, + feature_id: Optional[str] = None, ) -> None: + """ + Write a single GeoJSON Feature. + + :param geo_type_prefix: prefix of the ``type`` member. Empty (default) for a standard + RFC 7946 ``"Feature"``; the historical ``"AnyCrs"`` value marks + coordinates that are *not* in WGS84. + :param feature_id: value of the RFC 7946 ``id`` member (the energyml uuid, typically). + """ if mesh.point_list is not None and len(mesh.point_list) > 0: - points = mesh.point_list + # point_list / indices may be numpy arrays : json.dumps only accepts plain python types + points = _as_json_ready_list(mesh.point_list) - indices = mesh.get_indices() + indices = _as_json_ready_list(mesh.get_indices()) # polygon must have the first and last point as the same if geo_type == GeoJsonGeometryType.Polygon or geo_type == GeoJsonGeometryType.MultiPolygon: if logger is not None: @@ -1730,7 +1770,9 @@ def write_geojson_feature( logger.debug("# to_geojson_feature > Computing shape") out.write(b"{") # start feature - out.write(f'"type": "{geo_type_prefix}Feature", '.encode()) + out.write(f'"type": "{geo_type_prefix or ""}Feature", '.encode()) + if feature_id is not None: + out.write(f'"id": {json.dumps(feature_id)}, '.encode()) out.write(f'"properties": {json.dumps(properties or {}) }, '.encode()) out.write(b'"geometry": ') @@ -1738,6 +1780,7 @@ def write_geojson_feature( # "type": f"{geo_type_prefix}{geo_type.name}", out.write(f'"type": "{geo_type.name}", '.encode()) out.write('"coordinates": '.encode()) + coordinates_start = out.tell() mins, maxs = _write_geojson_shape( out=out, geo_type=geo_type, @@ -1746,6 +1789,15 @@ def write_geojson_feature( point_offset=point_offset, logger=logger, ) + if out.tell() == coordinates_start: + # the shape could not be written (see the error logged by _write_geojson_shape) : + # write an empty coordinate list so that the document stays valid JSON + (logger or logging).error( + f"No coordinate written for the {geo_type.name} geometry of '{mesh.identifier}' " + f"({len(points)} points) — an empty geometry is written instead." + ) + out.write(b"[]") + bbox_geometry = mins + maxs # TODO : see : https://www.rfc-editor.org/rfc/rfc7946#section-5 out.write(f', "bbox": {json.dumps(bbox_geometry)}'.encode()) @@ -1772,6 +1824,75 @@ def mesh_to_geojson_type(obj: AbstractMesh) -> GeoJsonGeometryType: return GeoJsonGeometryType.MultiPoint +def _geojson_mesh_metadata(mesh: AbstractMesh, workspace: Optional[EnergymlStorageInterface] = None) -> Dict: + """ + Build the properties of a feature from the energyml object carried by *mesh* : + uuid, qualified type, Citation fields, and EPSG codes when a CRS is available. + """ + properties: Dict = dict(get_object_metadata(getattr(mesh, "energyml_object", None))) + + crs_obj = getattr(mesh, "crs_object", None) + if isinstance(crs_obj, list): + crs_obj = crs_obj[0] if crs_obj else None + if crs_obj is not None: + crs_info = extract_crs_info(crs_obj, workspace) + if crs_info.projected_epsg_code is not None: + properties["projected_epsg_code"] = crs_info.projected_epsg_code + if crs_info.vertical_epsg_code is not None: + properties["vertical_epsg_code"] = crs_info.vertical_epsg_code + if getattr(mesh, "identifier", None): + properties["identifier"] = mesh.identifier + return properties + + +def _geojson_reproject_mesh( + mesh: AbstractMesh, + workspace: Optional[EnergymlStorageInterface] = None, + use_network: bool = False, + logger: Optional[Any] = None, +) -> Tuple[AbstractMesh, bool, Optional[int], Optional[int]]: + """ + Return ``(mesh, is_wgs84, projected_epsg_code, vertical_epsg_code)`` where *mesh* is a shallow + copy whose ``point_list`` has been reprojected to WGS84, or the original mesh when the + reprojection is impossible (no EPSG code, pyproj missing, transformation error). + """ + from dataclasses import replace + + crs_obj = getattr(mesh, "crs_object", None) + if isinstance(crs_obj, list): + crs_obj = crs_obj[0] if crs_obj else None + if crs_obj is None or mesh.point_list is None or len(mesh.point_list) == 0: + return mesh, False, None, None + + crs_info = extract_crs_info(crs_obj, workspace) + if crs_info.projected_epsg_code is None: + (logger or logging).warning( + "GeoJSON export: no projected EPSG code found — coordinates are left in their source CRS " + "(non RFC 7946 conformant)." + ) + return mesh, False, None, crs_info.vertical_epsg_code + + if not is_pyproj_available(): + (logger or logging).warning( + "GeoJSON export: pyproj is not installed (pip install energyml-utils[crs]) — " + f"coordinates are left in EPSG:{crs_info.projected_epsg_code} instead of WGS84." + ) + return mesh, False, crs_info.projected_epsg_code, crs_info.vertical_epsg_code + + try: + points = np.asarray(mesh.point_list, dtype=np.float64).reshape(-1, 3) + reprojected = reproject_to_wgs84(points, crs_info, use_network=use_network) + return ( + replace(mesh, point_list=reprojected.tolist()), + True, + crs_info.projected_epsg_code, + (crs_info.vertical_epsg_code), + ) + except Exception as e: + (logger or logging).warning(f"GeoJSON export: reprojection to WGS84 failed ({e}) — keeping source coordinates.") + return mesh, False, crs_info.projected_epsg_code, crs_info.vertical_epsg_code + + def export_geojson_io( out: BytesIO, mesh_list: List[AbstractMesh], @@ -1779,7 +1900,50 @@ def export_geojson_io( properties: Optional[List[Optional[Dict]]] = None, global_properties: Optional[Dict] = None, logger: Optional[Any] = None, + workspace: Optional[EnergymlStorageInterface] = None, + to_wgs84: bool = True, + include_metadata: bool = True, + use_network: bool = False, ): + """ + Stream a list of meshes as a GeoJSON FeatureCollection. + + :param out: output stream + :param mesh_list: meshes to export + :param obj_name: value of the ``name`` member of the collection + :param properties: explicit per-mesh properties; when None (and :param:`include_metadata` is + True) they are built from the energyml object of each mesh (uuid, + qualified type, Citation fields, EPSG codes) + :param global_properties: extra members written at the collection level + :param logger: + :param workspace: used to resolve the CRS objects (needed for the v2.2 compound CRS) + :param to_wgs84: when True (default), coordinates are reprojected to WGS84 as required by + RFC 7946. When the reprojection is not possible, the source CRS is + advertised through the ``crs`` / ``coordRefSys`` members. + :param include_metadata: add the energyml metadata to the properties of every feature + :param use_network: allow PROJ to download the geoid grids used by vertical transformations + """ + exported: List[Tuple[AbstractMesh, Dict]] = [] + crs_states: set = set() + + for mesh in mesh_list: + feature_properties: Dict = {} + if include_metadata: + feature_properties.update(_geojson_mesh_metadata(mesh, workspace)) + + is_wgs84 = False + projected_epsg_code = feature_properties.get("projected_epsg_code") + vertical_epsg_code = feature_properties.get("vertical_epsg_code") + if to_wgs84: + mesh, is_wgs84, projected_epsg_code, vertical_epsg_code = _geojson_reproject_mesh( + mesh, workspace=workspace, use_network=use_network, logger=logger + ) + if is_wgs84: + feature_properties["source_crs"] = f"EPSG:{projected_epsg_code}" + feature_properties["coordinates_crs"] = "OGC:CRS84" + crs_states.add((projected_epsg_code, vertical_epsg_code, is_wgs84)) + exported.append((mesh, feature_properties)) + out.write(b"{") out.write(b'"type": "FeatureCollection",') if obj_name is not None: @@ -1787,6 +1951,17 @@ def export_geojson_io( out.write(obj_name.encode()) out.write(b'",') + # A WGS84 document is implicitly in CRS84 and must not carry a 'crs' member (RFC 7946). + not_wgs84 = [state for state in crs_states if not state[2] and state[0] is not None] + if len(not_wgs84) == 1: + for k, v in _geojson_crs_members(not_wgs84[0][0], not_wgs84[0][1]).items(): + out.write(f'"{k}": {json.dumps(v)},'.encode()) + elif len(not_wgs84) > 1: + (logger or logging).warning( + f"GeoJSON export: {len(not_wgs84)} different source CRS in the same FeatureCollection — " + "no collection-level CRS is declared, see the per-feature 'projected_epsg_code' property." + ) + if global_properties is not None and len(global_properties) > 0: for k, v in global_properties.items(): out.write(b'"') @@ -1800,17 +1975,21 @@ def export_geojson_io( cpt = 0 point_offset = 0 - for mesh in mesh_list: + for mesh, feature_properties in exported: pos = out.tell() + explicit = properties[cpt] if properties is not None and len(properties) > cpt else None write_geojson_feature( out=out, mesh=mesh, geo_type=mesh_to_geojson_type(mesh), - properties=properties[cpt] if properties is not None and len(properties) > cpt else None, + # "AnyCrsFeature" keeps flagging the features whose coordinates are not WGS84 + geo_type_prefix="" if feature_properties.get("coordinates_crs") == "OGC:CRS84" else "AnyCrs", + properties={**feature_properties, **(explicit or {})}, + feature_id=feature_properties.get("uuid"), point_offset=0, # point_offset, logger=logger, ) - if out.tell() != pos and cpt < len(mesh_list) - 1: + if out.tell() != pos and cpt < len(exported) - 1: out.write(b",") cpt += 1 point_offset = point_offset + len(mesh.point_list) @@ -1823,15 +2002,28 @@ def export_geojson_dict( obj_name: Optional[str] = None, properties: Optional[List[Optional[Dict]]] = None, logger: Optional[Any] = None, + workspace: Optional[EnergymlStorageInterface] = None, + include_metadata: bool = True, ): + """ + Same as :func:`export_geojson_io` but returns a dict instead of streaming. + + Note: this variant does **not** reproject to WGS84; use :func:`export_geojson_io` or + :func:`energyml.utils.data.export.export_geojson` when a standard RFC 7946 output is needed. + """ res = {"type": "FeatureCollection", "features": []} cpt = 0 point_offset = 0 for mesh in mesh_list: + explicit = properties[cpt] if properties is not None and len(properties) > cpt else None + feature_properties = _geojson_mesh_metadata(mesh, workspace) if include_metadata else {} + feature_properties.update(explicit or {}) feature = to_geojson_feature( mesh=mesh, geo_type=mesh_to_geojson_type(mesh), - properties=properties[cpt] if properties is not None and len(properties) > cpt else None, + geo_type_prefix="AnyCrs", # coordinates are left in their source CRS here + properties=feature_properties, + feature_id=feature_properties.get("uuid"), point_offset=0, # point_offset, logger=logger, ) @@ -1963,17 +2155,47 @@ def _export_obj_elt( # off_face_part.write(b"\n") +def _list_exportable_uuids(epc: EpcStreamReader, logger: Optional[Any] = None) -> List[str]: + """ + Return the uuids of every object of the EPC that has a mesh reader (i.e. that can be + exported as a 3D / GeoJSON file). + """ + uuids: List[str] = [] + for metadata in epc.list_objects(): + object_type = getattr(metadata, "object_type", None) + uuid = getattr(metadata, "uuid", None) + if not object_type or not uuid or uuid in uuids: + continue + if get_object_reader_function(_mesh_name_mapping(object_type)) is not None: + uuids.append(uuid) + (logger or logging).debug(f"{len(uuids)} exportable representations found") + return uuids + + def export_multiple_data( epc_path: str, - uuid_list: List[str], - output_folder_path: str, + uuid_list: Optional[List[str]] = None, + output_folder_path: str = ".", output_file_path_suffix: str = "", file_format: MeshFileFormat = MeshFileFormat.OBJ, use_crs_displacement: bool = True, logger: Optional[Any] = None, + to_wgs84: bool = True, + use_network: bool = False, ): + """ + :param uuid_list: uuids of the representations to export. When None or empty, every + exportable representation of the EPC is exported. + :param to_wgs84: GeoJSON only — reproject the coordinates to WGS84 (RFC 7946) when the EPSG + codes are available and ``pyproj`` is installed. + :param use_network: GeoJSON only — allow PROJ to download the geoid grids needed by the + vertical datum transformation. + """ epc = EpcStreamReader(epc_path) + if not uuid_list: + uuid_list = _list_exportable_uuids(epc, logger) + # with open(epc_path.replace(".epc", ".h5"), "rb") as fh: # buf = BytesIO(fh.read()) # epc.h5_io_files.append(buf) @@ -2001,30 +2223,41 @@ def export_multiple_data( ) file_path = f"{output_folder_path}/{file_name}" logging.debug(f"Exporting : {file_path}") - mesh_list = read_mesh_object( - energyml_object=energyml_obj, - workspace=epc, - use_crs_displacement=use_crs_displacement, - ) - if file_format == MeshFileFormat.OBJ: - with open(file_path, "wb") as f: - export_obj( - mesh_list=mesh_list, - out=f, - ) - elif file_format == MeshFileFormat.OFF: - with open(file_path, "wb") as f: - export_off( - mesh_list=mesh_list, - out=f, - ) - elif file_format == MeshFileFormat.GEOJSON: - with open(file_path, "wb") as f: - export_geojson_io( - out=f, - mesh_list=mesh_list, - logger=logger, - global_properties={"epc_path": epc_path}, - ) - else: - logging.error(f"Code is not written for format {file_format}") + + # a representation that cannot be read (e.g. a trajectory without geometry) must not + # stop the export of the others + try: + mesh_list = read_mesh_object( + energyml_object=energyml_obj, + workspace=epc, + use_crs_displacement=use_crs_displacement, + ) + + if file_format == MeshFileFormat.OBJ: + with open(file_path, "wb") as f: + export_obj( + mesh_list=mesh_list, + out=f, + ) + elif file_format == MeshFileFormat.OFF: + with open(file_path, "wb") as f: + export_off( + mesh_list=mesh_list, + out=f, + ) + elif file_format == MeshFileFormat.GEOJSON: + with open(file_path, "wb") as f: + export_geojson_io( + out=f, + mesh_list=mesh_list, + obj_name=get_object_attribute(energyml_obj, "citation.title"), + logger=logger, + workspace=epc, + to_wgs84=to_wgs84, + use_network=use_network, + global_properties={"epc_path": epc_path}, + ) + else: + logging.error(f"Code is not written for format {file_format}") + except Exception as e: + (logger or logging).error(f"Failed to export the object {uuid} : {type(e).__name__}: {e}") diff --git a/energyml-utils/src/energyml/utils/introspection.py b/energyml-utils/src/energyml/utils/introspection.py index 1128ac7..383c65c 100644 --- a/energyml-utils/src/energyml/utils/introspection.py +++ b/energyml-utils/src/energyml/utils/introspection.py @@ -1394,6 +1394,67 @@ def get_obj_title(obj: Any) -> Optional[str]: return None +#: Citation sub-attributes exported by :func:`get_object_metadata`, mapped to the metadata key. +_CITATION_ATTRIBUTES_ = { + "title": "title", + "originator": "originator", + "creation": "creation", + "last_update": "last_update", + "editor": "editor", + "format": "format", + "description": "description", +} + + +def get_object_metadata(obj: Any) -> Dict[str, Any]: + """ + Extract the identification metadata of an energyml object as a plain ``dict``. + + Collected values (absent / empty ones are omitted) : + - ``uuid``, ``object_version`` + - ``qualified_type`` (e.g. ``resqml22.TriangulatedSetRepresentation``), ``content_type`` + - ``uri`` (ETP URI) + - the ``Citation`` fields : ``title``, ``originator``, ``creation``, ``last_update``, + ``editor``, ``format``, ``description``. Dates are returned as ISO 8601 strings. + + Never raises : an unreadable attribute is simply skipped. + + :param obj: an energyml data object + :return: a JSON-serializable dict + """ + metadata: Dict[str, Any] = {} + if obj is None: + return metadata + + for key, getter in ( + ("uuid", lambda: get_obj_uuid(obj)), + ("object_version", lambda: get_obj_version(obj)), + ("qualified_type", lambda: get_qualified_type_from_class(obj)), + ("content_type", lambda: get_content_type_from_class(obj)), + ("uri", lambda: str(get_object_uri(obj))), + ): + try: + value = getter() + except Exception: # a partially filled object must not break the export + continue + if value is not None and str(value) != "": + metadata[key] = value if isinstance(value, (int, float, bool)) else str(value) + + citation = get_object_attribute_no_verif(obj, "citation", default=None) + if citation is not None: + for attribute_name, key in _CITATION_ATTRIBUTES_.items(): + try: + value = get_object_attribute_no_verif(citation, attribute_name, default=None) + except Exception: + continue + if value is None or str(value) == "": + continue + # XmlDateTime / XmlDate values serialize to ISO 8601 through str() + metadata[key] = value if isinstance(value, (int, float, bool)) else str(value) + + return metadata + + def get_obj_pkg_pkgv_type_uuid_version( obj: Any, ) -> Tuple[Optional[str], Optional[str], Optional[str], Optional[str], Optional[str]]: diff --git a/energyml-utils/tests/test_geojson_export.py b/energyml-utils/tests/test_geojson_export.py new file mode 100644 index 0000000..5134510 --- /dev/null +++ b/energyml-utils/tests/test_geojson_export.py @@ -0,0 +1,218 @@ +# Copyright (c) 2023-2024 Geosiris. +# SPDX-License-Identifier: Apache-2.0 +""" +Tests for the GeoJSON export : energyml metadata, CRS declaration and WGS84 reprojection. + +The tests run against the real EPC fixture ``rc/epc/80wells_surf.epc`` (RESQML v2.2, whose +representations reference a standalone ``ProjectedCrs`` with EPSG:3949 — Lambert-93 CC49). + +The reprojection tests are skipped when the ``crs`` extra (pyproj) is not installed. +""" +from __future__ import annotations + +import io +import json +from pathlib import Path + +import numpy as np +import pytest + +from energyml.utils.data import crs as crs_module +from energyml.utils.data.crs import ( + build_source_crs_id, + crs_ogc_uri, + crs_urn, + extract_crs_info, + is_pyproj_available, +) +from energyml.utils.data.export import GeoJSONExportOptions, _geojson_crs_members, _feature_id, export_geojson +from energyml.utils.epc import Epc +from energyml.utils.introspection import get_object_metadata + +_EPC_PATH = Path(__file__).parent.parent / "rc" / "epc" / "80wells_surf.epc" + +requires_pyproj = pytest.mark.skipif(not is_pyproj_available(), reason="requires the 'crs' extra (pyproj)") + + +@pytest.fixture(scope="module") +def epc() -> Epc: + return Epc.read_file(str(_EPC_PATH)) + + +@pytest.fixture(scope="module") +def point_set_object(epc: Epc): + obj = next((o for o in epc.energyml_objects if "PointSet" in type(o).__name__), None) + if obj is None: + pytest.skip("no PointSetRepresentation in the fixture") + return obj + + +def _read_multi_mesh(obj, epc): + from energyml.utils.data.mesh_numpy import read_numpy_mesh_object + + return read_numpy_mesh_object(obj, workspace=epc, use_crs_displacement=True) + + +def _export(obj, epc, options: GeoJSONExportOptions) -> dict: + out = io.StringIO() + export_geojson(_read_multi_mesh(obj, epc), out, options) + return json.loads(out.getvalue()) + + +# --------------------------------------------------------------------------- +# CRS identifiers +# --------------------------------------------------------------------------- + + +class TestCrsIdentifiers: + def test_ogc_uri_and_urn(self): + assert crs_ogc_uri(32631) == "http://www.opengis.net/def/crs/EPSG/0/32631" + assert crs_urn(32631) == "urn:ogc:def:crs:EPSG::32631" + + def test_build_source_crs_id(self): + assert build_source_crs_id(32631) == "EPSG:32631" + assert build_source_crs_id(32631, 5773) == "EPSG:32631+EPSG:5773" + assert build_source_crs_id(None) is None + assert build_source_crs_id(None, 5773) is None + + def test_crs_members_horizontal_only(self): + members = _geojson_crs_members(3949, None) + assert members["crs"] == {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG::3949"}} + assert members["coordRefSys"] == crs_ogc_uri(3949) + + def test_crs_members_compound(self): + members = _geojson_crs_members(32631, 5773) + assert members["coordRefSys"] == [crs_ogc_uri(32631), crs_ogc_uri(5773)] + + def test_no_crs_member_without_epsg(self): + assert _geojson_crs_members(None, 5773) == {} + + +class TestFeatureId: + def test_uuid_only(self): + assert _feature_id("abc") == "abc" + + def test_with_patch_and_element(self): + assert _feature_id("abc", 1) == "abc_1" + assert _feature_id("abc", 1, 7) == "abc_1_7" + + def test_without_uuid(self): + assert _feature_id(None, 1) is None + + +# --------------------------------------------------------------------------- +# Metadata +# --------------------------------------------------------------------------- + + +class TestObjectMetadata: + def test_metadata_of_a_real_object(self, point_set_object): + metadata = get_object_metadata(point_set_object) + assert metadata["uuid"] == point_set_object.uuid + assert metadata["qualified_type"].endswith(".PointSetRepresentation") + assert metadata["title"] + # dates are exported as ISO 8601 strings + assert "T" in metadata["creation"] + + def test_metadata_of_none(self): + assert get_object_metadata(None) == {} + + +# --------------------------------------------------------------------------- +# GeoJSON output +# --------------------------------------------------------------------------- + + +class TestGeoJsonExport: + def test_features_carry_id_and_metadata(self, point_set_object, epc): + doc = _export(point_set_object, epc, GeoJSONExportOptions(indent=None)) + assert doc["type"] == "FeatureCollection" + feature = doc["features"][0] + assert feature["type"] == "Feature" + assert feature["id"].startswith(point_set_object.uuid) + properties = feature["properties"] + assert properties["uuid"] == point_set_object.uuid + assert properties["qualified_type"].endswith(".PointSetRepresentation") + assert properties["title"] + assert properties["projected_epsg_code"] == 3949 + + def test_collection_bbox(self, point_set_object, epc): + doc = _export(point_set_object, epc, GeoJSONExportOptions(indent=None)) + assert len(doc["bbox"]) == 6 + assert doc["bbox"][0] <= doc["bbox"][3] + assert doc["bbox"][1] <= doc["bbox"][4] + + def test_metadata_can_be_disabled(self, point_set_object, epc): + doc = _export(point_set_object, epc, GeoJSONExportOptions(indent=None, include_metadata=False)) + assert "title" not in doc["features"][0]["properties"] + + def test_source_crs_is_declared_when_not_reprojected(self, point_set_object, epc): + doc = _export(point_set_object, epc, GeoJSONExportOptions(indent=None, to_wgs84=False)) + assert doc["crs"]["properties"]["name"] == crs_urn(3949) + assert doc["coordRefSys"] == crs_ogc_uri(3949) + # coordinates stay in the projected CRS (metric values, far outside the lon/lat range) + assert abs(doc["features"][0]["geometry"]["coordinates"][0][0]) > 180 + + def test_fallback_when_pyproj_is_missing(self, point_set_object, epc, monkeypatch): + monkeypatch.setattr(crs_module, "is_pyproj_available", lambda: False) + doc = _export(point_set_object, epc, GeoJSONExportOptions(indent=None, to_wgs84=True)) + # no reprojection, but the source CRS must be advertised + assert doc["crs"]["properties"]["name"] == crs_urn(3949) + assert abs(doc["features"][0]["geometry"]["coordinates"][0][0]) > 180 + + @requires_pyproj + def test_wgs84_is_the_default(self, point_set_object, epc): + doc = _export(point_set_object, epc, GeoJSONExportOptions(indent=None)) + # an RFC 7946 document is implicitly CRS84 and must NOT carry a 'crs' member + assert "crs" not in doc + lon, lat = doc["features"][0]["geometry"]["coordinates"][0][:2] + assert -180.0 <= lon <= 180.0 + assert -90.0 <= lat <= 90.0 + properties = doc["features"][0]["properties"] + assert properties["source_crs"] == "EPSG:3949" + assert properties["coordinates_crs"] == "OGC:CRS84" + + +# --------------------------------------------------------------------------- +# Reprojection +# --------------------------------------------------------------------------- + + +@requires_pyproj +class TestReprojection: + def test_utm31n_to_wgs84(self): + from energyml.utils.data.crs import reproject_to_wgs84 + + points = np.array([[463000.0, 6570000.0, -1500.0]]) + result = reproject_to_wgs84(points, projected_epsg_code=32631) + assert result.shape == (1, 3) + assert result[0][0] == pytest.approx(2.350943, abs=1e-5) + assert result[0][1] == pytest.approx(59.267329, abs=1e-5) + # without a vertical CRS the Z column is left untouched + assert result[0][2] == pytest.approx(-1500.0) + + def test_input_is_not_modified(self): + from energyml.utils.data.crs import reproject_to_wgs84 + + points = np.array([[463000.0, 6570000.0, -1500.0]]) + original = points.copy() + reproject_to_wgs84(points, projected_epsg_code=32631) + assert np.array_equal(points, original) + + def test_missing_epsg_raises(self): + from energyml.utils.data.crs import reproject_to_wgs84 + from energyml.utils.exception import NotEnoughInformationError + + with pytest.raises(NotEnoughInformationError): + reproject_to_wgs84(np.zeros((1, 3))) + + def test_crs_info_codes_are_used(self, point_set_object, epc): + from energyml.utils.data.crs import reproject_to_wgs84 + from energyml.utils.data.helper import get_crs_obj + + crs_obj = get_crs_obj(context_obj=point_set_object, root_obj=point_set_object, workspace=epc) + crs_info = extract_crs_info(crs_obj, epc) + assert crs_info.projected_epsg_code == 3949 + result = reproject_to_wgs84(np.array([[1656431.13, 8190610.64, 37.15]]), crs_info) + assert result[0][0] == pytest.approx(2.4055, abs=1e-3) + assert result[0][1] == pytest.approx(48.9140, abs=1e-3) From 5253614fa2c06fbb409e31253716567d478a330a Mon Sep 17 00:00:00 2001 From: Valentin Gauthier Date: Wed, 29 Jul 2026 18:24:21 +0200 Subject: [PATCH 03/14] new epcFile class (maybe better than others) --- energyml-utils/CLAUDE.md | 149 ++ energyml-utils/example/tools.py | 3 + energyml-utils/rc/epc/testingPackageCpp.epc | Bin 295770 -> 347223 bytes energyml-utils/rc/epc/testingPackageCpp22.epc | Bin 259757 -> 257549 bytes .../src/energyml/utils/data/mesh.py | 8 +- energyml-utils/src/energyml/utils/epc_file.py | 1453 +++++++++++++++++ energyml-utils/src/energyml/utils/zip_raw.py | 234 +++ energyml-utils/tests/test_epc_file.py | 652 ++++++++ energyml-utils/tests/test_zip_raw.py | 155 ++ 9 files changed, 2652 insertions(+), 2 deletions(-) create mode 100644 energyml-utils/CLAUDE.md create mode 100644 energyml-utils/src/energyml/utils/epc_file.py create mode 100644 energyml-utils/src/energyml/utils/zip_raw.py create mode 100644 energyml-utils/tests/test_epc_file.py create mode 100644 energyml-utils/tests/test_zip_raw.py diff --git a/energyml-utils/CLAUDE.md b/energyml-utils/CLAUDE.md new file mode 100644 index 0000000..38a89bf --- /dev/null +++ b/energyml-utils/CLAUDE.md @@ -0,0 +1,149 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Commands + +```bash +poetry install # dev install (pulls every energyml-* data model package) +poetry install --extras crs # + pyproj, needed for the WGS84 reprojection +poetry install --all-extras # + parquet / las / segy / geometry (scipy) + +poetry run pytest # full suite (tests/); addopts deselects the "slow" marker +poetry run pytest tests/test_crs_info.py::TestCrsInfoDto::test_defaults -q # single test +poetry run pytest --cov=src --cov-report=html + +poetry run black . # line-length 120, target py39 +poetry run flake8 src tests +poetry run pre-commit run --all-files # black + isort + flake8 +``` + +`[tool.pytest.ini_options]` puts `src` on `pythonpath`, so tests import `energyml.utils.*` without installing. +If a `poetry run