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:
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 = [