qgis-tem-loader

qgis plugin for loading TEM geophysical inversion XYZ files as 3D objects
git clone git://src.adamsgaard.dk/qgis-tem-loader # fast
git clone https://src.adamsgaard.dk/qgis-tem-loader.git # slow
Log | Files | Refs | README | LICENSE Back to index

commit 3628eeb35b61c226acab8c11e98f730378bf3c30
parent 4360e88195d3a7ba001b866900d7fe367980a3d8
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Fri, 15 May 2026 23:37:44 +0200

feat(qgis): apply DEM adjustment during load

Diffstat:
Mtem_loader/tem_loader.py | 9+++++++++
Mtest/test_core.py | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 83 insertions(+), 0 deletions(-)

diff --git a/tem_loader/tem_loader.py b/tem_loader/tem_loader.py @@ -340,6 +340,7 @@ class TEMLoaderPlugin: filepath, mask_below_doi=True, below_doi_opacity=core.BELOW_DOI_OPACITY, + elevation_raster_layer=None, ): points, doi_points, layers = core.process_xyz( filepath, @@ -349,6 +350,14 @@ class TEMLoaderPlugin: project = QgsProject.instance() crs = self._resolve_crs(filepath, project) + _adjust_rows_to_dem( + points, + doi_points, + layers, + elevation_raster_layer, + crs, + project, + ) gpkg_path = filepath.with_suffix('.gpkg') transform_context = project.transformContext() diff --git a/test/test_core.py b/test/test_core.py @@ -1452,6 +1452,80 @@ class PluginTests(unittest.TestCase): ["points", "doi", "layers"], ) + def test_load_xyz_applies_dem_adjustment_before_writing(self): + module, _, _ = self._import_plugin_module() + points = [ + { + "X": 1.0, + "Y": 2.0, + "Z": 3.0, + "Geometry": "POINT Z (1 2 3)", + } + ] + doi_points = [ + { + "X": 1.0, + "Y": 2.0, + "Z": -4.0, + "DOI": 7.0, + "ZDOI": -4.0, + "Geometry": "POINT Z (1 2 -4)", + } + ] + layers = [ + { + "X": 1.0, + "Y": 2.0, + "Z": 3.0, + "ZTop": 3.0, + "ZMid": 2.5, + "ZBottom": 2.0, + "DepthTop": 0.0, + "DepthBottom": 1.0, + "Layer": 1, + "Geometry": "LINESTRING Z (1 2 3, 1 2 2)", + } + ] + provider = Mock() + provider.sample.return_value = "50.0", True + raster_layer = Mock() + raster_layer.crs.return_value = module.QgsCoordinateReferenceSystem( + "EPSG:3857" + ) + raster_layer.dataProvider.return_value = provider + module.core.process_xyz = Mock(return_value=(points, doi_points, layers)) + module.core.detect_source_epsg = Mock(return_value="EPSG:25832") + plugin = module.TEMLoaderPlugin(Mock()) + + plugin._load_xyz( + Path("/tmp/model.xyz"), + mask_below_doi=False, + below_doi_opacity=35, + elevation_raster_layer=raster_layer, + ) + + module.core.process_xyz.assert_called_once_with( + Path("/tmp/model.xyz"), + mask_below_doi=False, + below_doi_opacity=35, + ) + self.assertEqual( + module.QgsVectorFileWriter.created[0].features[0].geometry.wkt, + "LINESTRING Z (1.0 2.0 50.0, 1.0 2.0 49.0)", + ) + self.assertEqual( + module.QgsVectorFileWriter.created[1].features[0].geometry.wkt, + "POINT Z (1.0 2.0 43.0)", + ) + self.assertEqual( + module.QgsVectorFileWriter.created[2].features[0].geometry.wkt, + "POINT Z (1.0 2.0 50.0)", + ) + self.assertEqual( + [call["crs"].authid() for call in module.QgsVectorFileWriter.calls], + ["EPSG:25832", "EPSG:25832", "EPSG:25832"], + ) + def test_load_xyz_skips_empty_doi_geopackage_layer(self): module, _, _ = self._import_plugin_module() points = [