mdal


Namemdal JSON
Version 1.1.0 PyPI version JSON
download
home_pagehttps://www.mdal.xyz
SummaryMesh data processing
upload_time2024-05-28 21:21:21
maintainerPaul Harwood
docs_urlNone
authorPaul Harwood
requires_pythonNone
licenseMIT
keywords mesh data spatial
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ================================================================================
MDAL Python Integration
================================================================================

.. image:: https://img.shields.io/conda/vn/conda-forge/mdal-python.svg
   :target: https://anaconda.org/conda-forge/mdal-python
   
.. image:: https://badge.fury.io/py/mdal.svg
   :target: https://badge.fury.io/py/mdal

Basics
------

MDAL Python integration allows you to access and manipulation geospatial mesh data sets using `MDAL`_ in Python.

Currently, this integration can:

- read and write all MDAL compatible file formats
- access vertex, face, edge and volume data as numpy arrays
- write vertex, face, edge and volume data from numpy arrays
- access and write scalar and vector datasets
- beta level read and write integration with `meshio`_
- beta level read integration with `Open3D`_


.. _MDAL: https://www.mdal.xyz/
.. _meshio: https://github.com/nschloe/meshio
.. _Open3D: http://www.open3d.org/

Drivers
.......

['2DM Mesh File', 'XMS Tin Mesh File', 'Selafin File', 'Esri TIN', 'Stanford PLY Ascii Mesh File', 'Flo2D', 'HEC-RAS 2D', 'TUFLOW FV', 'AnuGA', 'UGRID Results', 'GDAL NetCDF', 'GDAL Grib', 'DAT', 'Binary DAT', 'TUFLOW XMDF', 'XDMF']

Installation
------------

Conda
................................................................................

MDAL Python support is installable via Conda:

.. code-block::

    conda install -c conda-forge mdal-python

PyPI
...............................................................................

MDAL Python support can be installed using `pip`

.. note::

    The previous mdal-python package is deprecated and will not updated beyond 1.0.3. Use the mdal package instead.

.. code-block::

   pip install mdal
   
This will ONLY work if there is a valid and working installation of MDAL on the device and accessible through the device library search path.

.. note::

    As of version 1.1.0, this package has been written to the NumPy 2.0 ABI. This should work with any version of NumPy >= 1.25 and Python >=3.9


GitHub
................................................................................

The repository for MDAL's Python extension is available at https://github.com/ViRGIS-Team/mdal-python

Usage
--------------------------------------------------------------------------------

The basic usage can be seen in this code snippet:

.. code-block:: python


    from mdal import Datasource, Info, last_status, PyMesh, drivers, MDAL_DataLocation

    print(f"MDAL Version:  {Info.version}")
    print(f"MDAL Driver Count :{Info.driver_count}")
    print(last_status().name)

    for driver in Info.drivers:
        print(driver)


    ds = Datasource("data/ply/test_mesh.ply")
    print(ds.meshes)

    with ds.load(0) as mesh:
        print(f"Driver : {mesh.driver_name}")
        print(f"Format : {mesh.get_metadata('format')}")
        print(f"Vertex Count : {mesh.vertex_count}")
        print(f"Face Count : {mesh.face_count}")
        print(f"Largest Face: {mesh.largest_face}")
        print(f"Edge Count : {mesh.edge_count}")
        print(f"CRS : {mesh.projection}")
        print(f"Mesh extent : {mesh.extent}")
        print(f"Metadata : {mesh.metadata}")
        print(f"CRS Metadata : {mesh.get_metadata('crs')}")
        mesh.add_metadata("test", "value")
        print(f"Metadate set eqiuality : {mesh.get_metadata('test') == 'value'}")

        vertex = mesh.vertices
        print(f"Vertex Array Shape : {vertex.shape}")

        faces = mesh.faces
        print(f"Face Array Shape : {faces.shape}")

        edges = mesh.edges
        print(f"Edges Array Shape : {edges.shape}")

        print("")

        group = mesh.group(0)
        print(f"DatasetGroup Name : {group.name}")
        print(f"DatasetGroup Location : {group.location.name}")
        print(f"Dataset Count : {group.dataset_count}")
        print(f"Group has scalar values : {group.has_scalar}")
        print(f"Group has temporal values : {group.is_temporal}")
        print(f"Reference Time : {group.reference_time}")
        print(f"Maximum Vertical Level Count : {group.level_count}")
        print(f"Minimum / Maximum ; {group.minmax}")
        print(f"Metadata : {group.metadata}")
        print(f"Name Metadata : {group.get_metadata('name')}")
        group.add_metadata("test", "value")
        print(
            f"Metadate set eqiuality : {group.get_metadata('test') == 'value'}")

        print("")
        for i in range(0, group.dataset_count):
            data = group.data(i)
            time = group.dataset_time(i)
            print(f"Dataset Shape for time {time} : {data.shape}")

        print("")

        test = PyMesh()
        test.vertices = mesh.vertices
        test.faces = mesh.faces
        test.edges = mesh.edges
        print(f"Mesh Copy Equality : {test == mesh}")
        print(
            f"Mesh Vertex Size equality: {test.vertex_count == mesh.vertex_count}")
        print(f"Mesh Face Size equality: {test.face_count == mesh.face_count}")
        test.save("data/save_test.nc")

        test2 = PyMesh(drivers()[0])
        print(f"Mesh created by Driver : {test2.driver_name}")

        ds2 = Datasource("data/save_test.nc")
        test4 = ds2.load(0)
        print(f"Save equality : {test4 == test}")

        del(test)
        del(test4)
        mesh.save("save_test.ply")

    with Datasource("data/ply/all_features.ply").load(0) as mesh:
        mesh.save("save_test_2.ply")

        with Datasource("save_test_2.ply").load(0) as mesh2:
            print(f"Save equality 2 : {mesh == mesh2}")

    with Datasource("data/tuflowfv/withMaxes/trap_steady_05_3D.nc").load() as mesh:
        group = mesh.groups[1]
        a, b, c = group.volumetric(0)

        ds2 = Datasource("test_vol.ply")
        with ds2.add_mesh() as mesh2:
            mesh2.vertices = mesh.vertices
            mesh2.faces = mesh.faces

            print(f"Vertex Count :{mesh.vertex_count}")
            print(f"Face Count : {mesh.face_count}")

            group2 = mesh2.add_group(
                "test", location=MDAL_DataLocation.DataOnVolumes)
            group2.add_volumetric(group.data(), a, b)

            print(f"Level Count: {group2.level_count}")
            print(f"Location: {group2.location}")
            print(f"MinMax: {group2.minmax}")

            print(f"Dataset Count: {group2.dataset_count}")

            data = group2.data(0)
            print(f"Data Value Count: {len(data)}")
            print(f"{data}")

            print(f"{group2.volumetric(0)}")

            a, b, c = group2.volumetric(0)
            print(f"Number of Extrusion values : {len(b)}")
            mesh2.save()
            with ds2.load() as mesh3:
                mesh3.info()
                group3 = mesh3.groups[1]
                print(f"{group3.location}")
                d, e, f = group3.volumetric(0)
                print(f"{group3.volumetric(0)}")
                print(f"{group3.data(0)}")
                print("Mesh Equality : {mesh2 == mesh3}")


    """deep copy test"""

    with Datasource("data/ply/all_features.ply").load() as mesh:
        with ds.add_mesh("test") as mesh2:
            mesh2.deep_copy(mesh)
            mesh2.data_copy(mesh)
            print(f"{mesh2.info()}")


    print("all finished !")


Integration with meshio
-----------------------

There is read and write integration with the meshio package. Any MDAL mesh
can be converted to a meshio object and vice versa.

This integration is beta at the moment.

There are the following constraints:

- MDAL_transform.to_meshio can take as an argument either a Mesh or a Dataset Group,
- Only scalar MDAL datasets can be converted to meshio,
- Volumetric data must be passed as a Dataset Group,
- Volumetric meshio meshes and data are not currently converted, and
- MDAL_transform.from_meshio only converts cells of types ["line", "triangle", "quad"].

.. code-block:: python

    from mdal import Datasource,MDAL_transform

    """meshio tests"""
    with Datasource("data/ply/all_features.ply").load() as mesh:

        mio = MDAL_transform.to_meshio(mesh)
        print(f"{mio}")
        mio.write("test.vtk")

        group = mesh.group(1)

        mio2 = MDAL_transform.to_meshio(group)
        print(f"{mio2}")
        
        mesh2 = MDAL_transform.from_meshio(mio)
        print(f"{mesh2.info()}")
        print(f"{mesh2.group(0).data()}")
        print(f"{mesh2.vertex_count}")
        print(f"{mesh2.face_count}")

    with Datasource("test_vol.ply").load() as mesh:
        group = mesh.group(1)
        mio2 = MDAL_transform.to_meshio(group)
        print(f"{mio2}")


    print("all finished !")

Integration with Open3D
-----------------------

There is read-only integration with Open3D.

The MDAL_transform.to_triangle_mesh function converts any MDAL mesh to an Open3D TriangleMesh. The function
can take as an argument an MDAL mesh or Dataset Group. In the former case 
if there are colour Datasets then these are converted to the TraingleMesh colours.
In the later case, the data is converted to a false colur using a simple process -
scalar data is loaded into the red values and vector data to
the red and blue values.

The MDAL_transform.to_point_cloud converts a MDAL
volumetric DatasetGroup to an Open3D PointCloud with the data values
converted to color as above.

.. note::
    Open3D is NOT loaded as dependency. If these commands are used in an environment without Open3D, they will fail with a user friendly message.

This integration is beta at the moment.

.. code-block:: python

    from mdal import Datasource, MDAL_transform

    import numpy as np
    import open3d as o3d

    """
    Open3d Tests
    """
    with Datasource("data/ply/test_mesh.ply").load() as mesh:
        tm = MDAL_transform.to_triangle_mesh(mesh)
        print(tm)
        tm2 = o3d.io.read_triangle_mesh("data/ply/test_mesh.ply")
        tmc = np.asarray(tm.vertex_colors)
        tmc2 = np.asarray(tm2.vertex_colors)
        for i in range(len(tmc)):
            value = tmc[i] - tmc2[i]
            if not (value == [0, 0, 0]).all():
                print(value)
                break

    with Datasource("test_vol.ply").load() as mesh:
        pc = MDAL_transform.to_point_cloud(mesh.group(1))
        print(pc)


    print("all finished !")

.. note::

    About Python Versions. MDAL supports 3.8, 3.9 and 3.10. Open3D supports 3.6, 3.7 and 3.8. Therefore, 
    if you want to use Open3D, the Python version should be pinned to 3.8 before you start.


Documentation
-------------

The documentation is currently WIP and can be found at https://virgis-team.github.io/mdal-python/html/index.html


Requirements
------------

* MDAL 0.9.0 +
* Python >=3.8
* Cython (eg :code:`pip install cython`)
* Numpy (eg :code:`pip install numpy`)
* Packaging (eg :code:`pip install packaging`)
* scikit-build (eg :code:`pip install scikit-build`)


Credit
------

This package borrowed heavily from the `PDAL-Python`_ package.

.. _PDAL-Python:  https://github.com/PDAL/python


Changes
--------------------------------------------------------------------------------

1.1.0
-----

- Updates the NUMPy ABI to 2.0
- Fix the CI deprecation (#20)

1.0.3
-----

- fix debug message error (#15)
- Deprecate mdal-python (#16)

1.0.2
-----

- fix memory leaks and inconsistencies around the Datagroup object (#11)

1.0.1
-----

- Add the PyPI package


1.0.0
-----

First Read / Write Release

- read and write all MDAL compatible file formats
- access vertex, face, edge and volume data as numpy arrays
- write vertex, face, edge and volume data from numpy arrays
- access and write scalar and vector datasets
- beta level read and write integration with meshio
- beta level read integration with Open3D


0.9.0
-----

First release. This is beta software and has not been completely tested yet:

Currently, this integration can:

- read all MDAL compatible file formats,
- access the metadata for the source,
- access the vertex, face and edge data as numpy arrays,
- access 'double' datasets (both scalar and vector) as numpy arrays, and
- convert the MDAL source mesh into a `meshio`_ mesh object (with some restrictions currently).

This version does not currently allow the MDAL source mesh to be written or ammended.

            

Raw data

            {
    "_id": null,
    "home_page": "https://www.mdal.xyz",
    "name": "mdal",
    "maintainer": "Paul Harwood",
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": "runette@gmail.com",
    "keywords": "mesh data spatial",
    "author": "Paul Harwood",
    "author_email": "runette@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/0a/7b/7cf66cd545c76db7a14ec41bf6d029da708232fe85cb48cae45322cd6ce1/mdal-1.1.0.tar.gz",
    "platform": null,
    "description": "================================================================================\nMDAL Python Integration\n================================================================================\n\n.. image:: https://img.shields.io/conda/vn/conda-forge/mdal-python.svg\n   :target: https://anaconda.org/conda-forge/mdal-python\n   \n.. image:: https://badge.fury.io/py/mdal.svg\n   :target: https://badge.fury.io/py/mdal\n\nBasics\n------\n\nMDAL Python integration allows you to access and manipulation geospatial mesh data sets using `MDAL`_ in Python.\n\nCurrently, this integration can:\n\n- read and write all MDAL compatible file formats\n- access vertex, face, edge and volume data as numpy arrays\n- write vertex, face, edge and volume data from numpy arrays\n- access and write scalar and vector datasets\n- beta level read and write integration with `meshio`_\n- beta level read integration with `Open3D`_\n\n\n.. _MDAL: https://www.mdal.xyz/\n.. _meshio: https://github.com/nschloe/meshio\n.. _Open3D: http://www.open3d.org/\n\nDrivers\n.......\n\n['2DM Mesh File', 'XMS Tin Mesh File', 'Selafin File', 'Esri TIN', 'Stanford PLY Ascii Mesh File', 'Flo2D', 'HEC-RAS 2D', 'TUFLOW FV', 'AnuGA', 'UGRID Results', 'GDAL NetCDF', 'GDAL Grib', 'DAT', 'Binary DAT', 'TUFLOW XMDF', 'XDMF']\n\nInstallation\n------------\n\nConda\n................................................................................\n\nMDAL Python support is installable via Conda:\n\n.. code-block::\n\n    conda install -c conda-forge mdal-python\n\nPyPI\n...............................................................................\n\nMDAL Python support can be installed using `pip`\n\n.. note::\n\n    The previous mdal-python package is deprecated and will not updated beyond 1.0.3. Use the mdal package instead.\n\n.. code-block::\n\n   pip install mdal\n   \nThis will ONLY work if there is a valid and working installation of MDAL on the device and accessible through the device library search path.\n\n.. note::\n\n    As of version 1.1.0, this package has been written to the NumPy 2.0 ABI. This should work with any version of NumPy >= 1.25 and Python >=3.9\n\n\nGitHub\n................................................................................\n\nThe repository for MDAL's Python extension is available at https://github.com/ViRGIS-Team/mdal-python\n\nUsage\n--------------------------------------------------------------------------------\n\nThe basic usage can be seen in this code snippet:\n\n.. code-block:: python\n\n\n    from mdal import Datasource, Info, last_status, PyMesh, drivers, MDAL_DataLocation\n\n    print(f\"MDAL Version:  {Info.version}\")\n    print(f\"MDAL Driver Count :{Info.driver_count}\")\n    print(last_status().name)\n\n    for driver in Info.drivers:\n        print(driver)\n\n\n    ds = Datasource(\"data/ply/test_mesh.ply\")\n    print(ds.meshes)\n\n    with ds.load(0) as mesh:\n        print(f\"Driver : {mesh.driver_name}\")\n        print(f\"Format : {mesh.get_metadata('format')}\")\n        print(f\"Vertex Count : {mesh.vertex_count}\")\n        print(f\"Face Count : {mesh.face_count}\")\n        print(f\"Largest Face: {mesh.largest_face}\")\n        print(f\"Edge Count : {mesh.edge_count}\")\n        print(f\"CRS : {mesh.projection}\")\n        print(f\"Mesh extent : {mesh.extent}\")\n        print(f\"Metadata : {mesh.metadata}\")\n        print(f\"CRS Metadata : {mesh.get_metadata('crs')}\")\n        mesh.add_metadata(\"test\", \"value\")\n        print(f\"Metadate set eqiuality : {mesh.get_metadata('test') == 'value'}\")\n\n        vertex = mesh.vertices\n        print(f\"Vertex Array Shape : {vertex.shape}\")\n\n        faces = mesh.faces\n        print(f\"Face Array Shape : {faces.shape}\")\n\n        edges = mesh.edges\n        print(f\"Edges Array Shape : {edges.shape}\")\n\n        print(\"\")\n\n        group = mesh.group(0)\n        print(f\"DatasetGroup Name : {group.name}\")\n        print(f\"DatasetGroup Location : {group.location.name}\")\n        print(f\"Dataset Count : {group.dataset_count}\")\n        print(f\"Group has scalar values : {group.has_scalar}\")\n        print(f\"Group has temporal values : {group.is_temporal}\")\n        print(f\"Reference Time : {group.reference_time}\")\n        print(f\"Maximum Vertical Level Count : {group.level_count}\")\n        print(f\"Minimum / Maximum ; {group.minmax}\")\n        print(f\"Metadata : {group.metadata}\")\n        print(f\"Name Metadata : {group.get_metadata('name')}\")\n        group.add_metadata(\"test\", \"value\")\n        print(\n            f\"Metadate set eqiuality : {group.get_metadata('test') == 'value'}\")\n\n        print(\"\")\n        for i in range(0, group.dataset_count):\n            data = group.data(i)\n            time = group.dataset_time(i)\n            print(f\"Dataset Shape for time {time} : {data.shape}\")\n\n        print(\"\")\n\n        test = PyMesh()\n        test.vertices = mesh.vertices\n        test.faces = mesh.faces\n        test.edges = mesh.edges\n        print(f\"Mesh Copy Equality : {test == mesh}\")\n        print(\n            f\"Mesh Vertex Size equality: {test.vertex_count == mesh.vertex_count}\")\n        print(f\"Mesh Face Size equality: {test.face_count == mesh.face_count}\")\n        test.save(\"data/save_test.nc\")\n\n        test2 = PyMesh(drivers()[0])\n        print(f\"Mesh created by Driver : {test2.driver_name}\")\n\n        ds2 = Datasource(\"data/save_test.nc\")\n        test4 = ds2.load(0)\n        print(f\"Save equality : {test4 == test}\")\n\n        del(test)\n        del(test4)\n        mesh.save(\"save_test.ply\")\n\n    with Datasource(\"data/ply/all_features.ply\").load(0) as mesh:\n        mesh.save(\"save_test_2.ply\")\n\n        with Datasource(\"save_test_2.ply\").load(0) as mesh2:\n            print(f\"Save equality 2 : {mesh == mesh2}\")\n\n    with Datasource(\"data/tuflowfv/withMaxes/trap_steady_05_3D.nc\").load() as mesh:\n        group = mesh.groups[1]\n        a, b, c = group.volumetric(0)\n\n        ds2 = Datasource(\"test_vol.ply\")\n        with ds2.add_mesh() as mesh2:\n            mesh2.vertices = mesh.vertices\n            mesh2.faces = mesh.faces\n\n            print(f\"Vertex Count :{mesh.vertex_count}\")\n            print(f\"Face Count : {mesh.face_count}\")\n\n            group2 = mesh2.add_group(\n                \"test\", location=MDAL_DataLocation.DataOnVolumes)\n            group2.add_volumetric(group.data(), a, b)\n\n            print(f\"Level Count: {group2.level_count}\")\n            print(f\"Location: {group2.location}\")\n            print(f\"MinMax: {group2.minmax}\")\n\n            print(f\"Dataset Count: {group2.dataset_count}\")\n\n            data = group2.data(0)\n            print(f\"Data Value Count: {len(data)}\")\n            print(f\"{data}\")\n\n            print(f\"{group2.volumetric(0)}\")\n\n            a, b, c = group2.volumetric(0)\n            print(f\"Number of Extrusion values : {len(b)}\")\n            mesh2.save()\n            with ds2.load() as mesh3:\n                mesh3.info()\n                group3 = mesh3.groups[1]\n                print(f\"{group3.location}\")\n                d, e, f = group3.volumetric(0)\n                print(f\"{group3.volumetric(0)}\")\n                print(f\"{group3.data(0)}\")\n                print(\"Mesh Equality : {mesh2 == mesh3}\")\n\n\n    \"\"\"deep copy test\"\"\"\n\n    with Datasource(\"data/ply/all_features.ply\").load() as mesh:\n        with ds.add_mesh(\"test\") as mesh2:\n            mesh2.deep_copy(mesh)\n            mesh2.data_copy(mesh)\n            print(f\"{mesh2.info()}\")\n\n\n    print(\"all finished !\")\n\n\nIntegration with meshio\n-----------------------\n\nThere is read and write integration with the meshio package. Any MDAL mesh\ncan be converted to a meshio object and vice versa.\n\nThis integration is beta at the moment.\n\nThere are the following constraints:\n\n- MDAL_transform.to_meshio can take as an argument either a Mesh or a Dataset Group,\n- Only scalar MDAL datasets can be converted to meshio,\n- Volumetric data must be passed as a Dataset Group,\n- Volumetric meshio meshes and data are not currently converted, and\n- MDAL_transform.from_meshio only converts cells of types [\"line\", \"triangle\", \"quad\"].\n\n.. code-block:: python\n\n    from mdal import Datasource,MDAL_transform\n\n    \"\"\"meshio tests\"\"\"\n    with Datasource(\"data/ply/all_features.ply\").load() as mesh:\n\n        mio = MDAL_transform.to_meshio(mesh)\n        print(f\"{mio}\")\n        mio.write(\"test.vtk\")\n\n        group = mesh.group(1)\n\n        mio2 = MDAL_transform.to_meshio(group)\n        print(f\"{mio2}\")\n        \n        mesh2 = MDAL_transform.from_meshio(mio)\n        print(f\"{mesh2.info()}\")\n        print(f\"{mesh2.group(0).data()}\")\n        print(f\"{mesh2.vertex_count}\")\n        print(f\"{mesh2.face_count}\")\n\n    with Datasource(\"test_vol.ply\").load() as mesh:\n        group = mesh.group(1)\n        mio2 = MDAL_transform.to_meshio(group)\n        print(f\"{mio2}\")\n\n\n    print(\"all finished !\")\n\nIntegration with Open3D\n-----------------------\n\nThere is read-only integration with Open3D.\n\nThe MDAL_transform.to_triangle_mesh function converts any MDAL mesh to an Open3D TriangleMesh. The function\ncan take as an argument an MDAL mesh or Dataset Group. In the former case \nif there are colour Datasets then these are converted to the TraingleMesh colours.\nIn the later case, the data is converted to a false colur using a simple process -\nscalar data is loaded into the red values and vector data to\nthe red and blue values.\n\nThe MDAL_transform.to_point_cloud converts a MDAL\nvolumetric DatasetGroup to an Open3D PointCloud with the data values\nconverted to color as above.\n\n.. note::\n    Open3D is NOT loaded as dependency. If these commands are used in an environment without Open3D, they will fail with a user friendly message.\n\nThis integration is beta at the moment.\n\n.. code-block:: python\n\n    from mdal import Datasource, MDAL_transform\n\n    import numpy as np\n    import open3d as o3d\n\n    \"\"\"\n    Open3d Tests\n    \"\"\"\n    with Datasource(\"data/ply/test_mesh.ply\").load() as mesh:\n        tm = MDAL_transform.to_triangle_mesh(mesh)\n        print(tm)\n        tm2 = o3d.io.read_triangle_mesh(\"data/ply/test_mesh.ply\")\n        tmc = np.asarray(tm.vertex_colors)\n        tmc2 = np.asarray(tm2.vertex_colors)\n        for i in range(len(tmc)):\n            value = tmc[i] - tmc2[i]\n            if not (value == [0, 0, 0]).all():\n                print(value)\n                break\n\n    with Datasource(\"test_vol.ply\").load() as mesh:\n        pc = MDAL_transform.to_point_cloud(mesh.group(1))\n        print(pc)\n\n\n    print(\"all finished !\")\n\n.. note::\n\n    About Python Versions. MDAL supports 3.8, 3.9 and 3.10. Open3D supports 3.6, 3.7 and 3.8. Therefore, \n    if you want to use Open3D, the Python version should be pinned to 3.8 before you start.\n\n\nDocumentation\n-------------\n\nThe documentation is currently WIP and can be found at https://virgis-team.github.io/mdal-python/html/index.html\n\n\nRequirements\n------------\n\n* MDAL 0.9.0 +\n* Python >=3.8\n* Cython (eg :code:`pip install cython`)\n* Numpy (eg :code:`pip install numpy`)\n* Packaging (eg :code:`pip install packaging`)\n* scikit-build (eg :code:`pip install scikit-build`)\n\n\nCredit\n------\n\nThis package borrowed heavily from the `PDAL-Python`_ package.\n\n.. _PDAL-Python:  https://github.com/PDAL/python\n\n\nChanges\n--------------------------------------------------------------------------------\n\n1.1.0\n-----\n\n- Updates the NUMPy ABI to 2.0\n- Fix the CI deprecation (#20)\n\n1.0.3\n-----\n\n- fix debug message error (#15)\n- Deprecate mdal-python (#16)\n\n1.0.2\n-----\n\n- fix memory leaks and inconsistencies around the Datagroup object (#11)\n\n1.0.1\n-----\n\n- Add the PyPI package\n\n\n1.0.0\n-----\n\nFirst Read / Write Release\n\n- read and write all MDAL compatible file formats\n- access vertex, face, edge and volume data as numpy arrays\n- write vertex, face, edge and volume data from numpy arrays\n- access and write scalar and vector datasets\n- beta level read and write integration with meshio\n- beta level read integration with Open3D\n\n\n0.9.0\n-----\n\nFirst release. This is beta software and has not been completely tested yet:\n\nCurrently, this integration can:\n\n- read all MDAL compatible file formats,\n- access the metadata for the source,\n- access the vertex, face and edge data as numpy arrays,\n- access 'double' datasets (both scalar and vector) as numpy arrays, and\n- convert the MDAL source mesh into a `meshio`_ mesh object (with some restrictions currently).\n\nThis version does not currently allow the MDAL source mesh to be written or ammended.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Mesh data processing",
    "version": "1.1.0",
    "project_urls": {
        "Homepage": "https://www.mdal.xyz"
    },
    "split_keywords": [
        "mesh",
        "data",
        "spatial"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "773500d48689635e93ffbe5391cb01e6ff1ffb2efe7e161dc7ebd07aa38edf6c",
                "md5": "5ced3b517038a3e88513cf526e8d4fc5",
                "sha256": "f98b6dca3504a209de953f5584c060f6bee4ff7821fe8d405df504faa6f2a54e"
            },
            "downloads": -1,
            "filename": "mdal-1.1.0-cp310-cp310-macosx_12_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5ced3b517038a3e88513cf526e8d4fc5",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 144529,
            "upload_time": "2024-05-28T21:21:05",
            "upload_time_iso_8601": "2024-05-28T21:21:05.977030Z",
            "url": "https://files.pythonhosted.org/packages/77/35/00d48689635e93ffbe5391cb01e6ff1ffb2efe7e161dc7ebd07aa38edf6c/mdal-1.1.0-cp310-cp310-macosx_12_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "82c732bc016a659b5c00f230d36265f98f44998e31d1dad589d00dec7be379a5",
                "md5": "ea93550e28bf3abe691207baaa7aca8e",
                "sha256": "3071f921ca732453058e714396de96b8643518b8169a223a64e3e133ba81b49a"
            },
            "downloads": -1,
            "filename": "mdal-1.1.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "ea93550e28bf3abe691207baaa7aca8e",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 125751,
            "upload_time": "2024-05-28T21:21:08",
            "upload_time_iso_8601": "2024-05-28T21:21:08.798878Z",
            "url": "https://files.pythonhosted.org/packages/82/c7/32bc016a659b5c00f230d36265f98f44998e31d1dad589d00dec7be379a5/mdal-1.1.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9220f490d622bd0c0b5577e80be1ed4f6cdc3d43fe3ecbe9ab8f4cb6a3d71b9e",
                "md5": "5789ab85a26cbfe64ced1f3950d78c12",
                "sha256": "706361d5c1032a33eec6b5a68db675fdb96291cdd09cb4471037cf949d0fbac0"
            },
            "downloads": -1,
            "filename": "mdal-1.1.0-cp311-cp311-macosx_12_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "5789ab85a26cbfe64ced1f3950d78c12",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 146420,
            "upload_time": "2024-05-28T21:21:10",
            "upload_time_iso_8601": "2024-05-28T21:21:10.378946Z",
            "url": "https://files.pythonhosted.org/packages/92/20/f490d622bd0c0b5577e80be1ed4f6cdc3d43fe3ecbe9ab8f4cb6a3d71b9e/mdal-1.1.0-cp311-cp311-macosx_12_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8d5399751067a8814acbf7012c6c800b72056f8d941aa86abbb1e6bc39e21b17",
                "md5": "8feeb4f3fdf0c647104ce58d63a5ac12",
                "sha256": "3857c05fe5331d49dd02595a6c1abacc49c89d42b10feb1d405664e49b222bfb"
            },
            "downloads": -1,
            "filename": "mdal-1.1.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "8feeb4f3fdf0c647104ce58d63a5ac12",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 126293,
            "upload_time": "2024-05-28T21:21:11",
            "upload_time_iso_8601": "2024-05-28T21:21:11.771244Z",
            "url": "https://files.pythonhosted.org/packages/8d/53/99751067a8814acbf7012c6c800b72056f8d941aa86abbb1e6bc39e21b17/mdal-1.1.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e80eea34126f1568b718ce0d9ce24a40f1c3a6a7e437f6767099fb611e59c90e",
                "md5": "a903c16c66fa2f1895bafa84dd2b4d72",
                "sha256": "be57faf86c5a1cab0442a698d59675e99737363328dc109abc14f8753ad70be1"
            },
            "downloads": -1,
            "filename": "mdal-1.1.0-cp312-cp312-macosx_12_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a903c16c66fa2f1895bafa84dd2b4d72",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 144005,
            "upload_time": "2024-05-28T21:21:13",
            "upload_time_iso_8601": "2024-05-28T21:21:13.282259Z",
            "url": "https://files.pythonhosted.org/packages/e8/0e/ea34126f1568b718ce0d9ce24a40f1c3a6a7e437f6767099fb611e59c90e/mdal-1.1.0-cp312-cp312-macosx_12_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "95a413709598c2aedcae9a8ea679b87de2f019abc02dc082149ab5b31907956d",
                "md5": "6f735c74e9049bbf9ef76ff1ea1725c6",
                "sha256": "75ecd6015cb6a5409bf72eaded224bdb9053a663c7721d88aa3fd8ca4fe6b1f8"
            },
            "downloads": -1,
            "filename": "mdal-1.1.0-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "6f735c74e9049bbf9ef76ff1ea1725c6",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 123650,
            "upload_time": "2024-05-28T21:21:15",
            "upload_time_iso_8601": "2024-05-28T21:21:15.209808Z",
            "url": "https://files.pythonhosted.org/packages/95/a4/13709598c2aedcae9a8ea679b87de2f019abc02dc082149ab5b31907956d/mdal-1.1.0-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f24bebdd14e8b82657832cf742b1c2ed4c48a4cb8f56c30ef53b33f9b0510307",
                "md5": "8f67c5dc20fce67199097a53a11c555a",
                "sha256": "af0cbbd434e7516be86bcb924c738dafebf94bc6944394aa5d05520b0df992c0"
            },
            "downloads": -1,
            "filename": "mdal-1.1.0-cp39-cp39-macosx_12_0_x86_64.whl",
            "has_sig": false,
            "md5_digest": "8f67c5dc20fce67199097a53a11c555a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 145097,
            "upload_time": "2024-05-28T21:21:16",
            "upload_time_iso_8601": "2024-05-28T21:21:16.641587Z",
            "url": "https://files.pythonhosted.org/packages/f2/4b/ebdd14e8b82657832cf742b1c2ed4c48a4cb8f56c30ef53b33f9b0510307/mdal-1.1.0-cp39-cp39-macosx_12_0_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "aac14551319a66f11cd0e48bd79996e43eb9e288b5b6aef7b2385ba5059ce7a2",
                "md5": "33abb9c4bcf3b1a57a68906d93f5e3e1",
                "sha256": "048268c2e4539b5e0bb4f310e539d2e46c0c166a273092a9d9c857c259a293e7"
            },
            "downloads": -1,
            "filename": "mdal-1.1.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "33abb9c4bcf3b1a57a68906d93f5e3e1",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 126112,
            "upload_time": "2024-05-28T21:21:18",
            "upload_time_iso_8601": "2024-05-28T21:21:18.213068Z",
            "url": "https://files.pythonhosted.org/packages/aa/c1/4551319a66f11cd0e48bd79996e43eb9e288b5b6aef7b2385ba5059ce7a2/mdal-1.1.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0a7b7cf66cd545c76db7a14ec41bf6d029da708232fe85cb48cae45322cd6ce1",
                "md5": "65cb6df7f646b7d4e09505d8b76e1d26",
                "sha256": "a7b33e06c2177198a36eb12b3d70e36548054f0228dd3e840f8598e6e33b9a11"
            },
            "downloads": -1,
            "filename": "mdal-1.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "65cb6df7f646b7d4e09505d8b76e1d26",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 56141621,
            "upload_time": "2024-05-28T21:21:21",
            "upload_time_iso_8601": "2024-05-28T21:21:21.418688Z",
            "url": "https://files.pythonhosted.org/packages/0a/7b/7cf66cd545c76db7a14ec41bf6d029da708232fe85cb48cae45322cd6ce1/mdal-1.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-28 21:21:21",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "mdal"
}
        
Elapsed time: 3.82437s