commit 30e7f041787c8d7fc4ef12ae7bc5db151fb5e37f
parent a4111ccf9b8799ef37c438a4a7d57e47eac04420
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Wed, 8 Apr 2026 17:24:36 +0200
fix(styles): expand DOI color range
Diffstat:
2 files changed, 52 insertions(+), 12 deletions(-)
diff --git a/tem_loader/styles/doi.qml b/tem_loader/styles/doi.qml
@@ -145,16 +145,16 @@
</elevation>
<renderer-v2 attr="DOI" enableorderby="0" forceraster="0" graduatedMethod="GraduatedColor" referencescale="-1" symbollevels="0" type="graduatedSymbol">
<ranges>
- <range label="39 - 43" lower="39.000000000000000" render="true" symbol="0" upper="43.000000000000000" uuid="{16bc2470-994a-4172-9b5a-43d11773f0b3}"/>
- <range label="43 - 52" lower="43.000000000000000" render="true" symbol="1" upper="52.000000000000000" uuid="{1909ea59-03b3-452f-9506-696d6868f461}"/>
- <range label="52 - 60" lower="52.000000000000000" render="true" symbol="2" upper="60.000000000000000" uuid="{d91574b6-f166-464c-9b75-507f197bed39}"/>
- <range label="60 - 67" lower="60.000000000000000" render="true" symbol="3" upper="67.000000000000000" uuid="{705bb642-a613-4c10-a4c2-5178a7e73100}"/>
- <range label="67 - 76" lower="67.000000000000000" render="true" symbol="4" upper="76.000000000000000" uuid="{803e30cf-04f6-4dc4-89aa-c990a43b0647}"/>
- <range label="76 - 83" lower="76.000000000000000" render="true" symbol="5" upper="83.000000000000000" uuid="{7e02135d-d6b5-4976-953b-a1fea7b9e88f}"/>
- <range label="83 - 90" lower="83.000000000000000" render="true" symbol="6" upper="90.000000000000000" uuid="{5e239b7f-f691-4411-9244-110866d0b9cb}"/>
- <range label="90 - 96" lower="90.000000000000000" render="true" symbol="7" upper="96.000000000000000" uuid="{0bc1b188-7e39-4bf5-9ccc-7cfb1c217140}"/>
- <range label="96 - 103" lower="96.000000000000000" render="true" symbol="8" upper="103.000000000000000" uuid="{2264f038-1c90-4681-8e03-02ca065c8986}"/>
- <range label="103 - 110" lower="103.000000000000000" render="true" symbol="9" upper="110.000000000000000" uuid="{dba00766-b289-4e1b-a938-d4dfde74a685}"/>
+ <range label="0 - 50" lower="0.000000000000000" render="true" symbol="0" upper="50.000000000000000" uuid="{16bc2470-994a-4172-9b5a-43d11773f0b3}"/>
+ <range label="50 - 100" lower="50.000000000000000" render="true" symbol="1" upper="100.000000000000000" uuid="{1909ea59-03b3-452f-9506-696d6868f461}"/>
+ <range label="100 - 150" lower="100.000000000000000" render="true" symbol="2" upper="150.000000000000000" uuid="{d91574b6-f166-464c-9b75-507f197bed39}"/>
+ <range label="150 - 200" lower="150.000000000000000" render="true" symbol="3" upper="200.000000000000000" uuid="{705bb642-a613-4c10-a4c2-5178a7e73100}"/>
+ <range label="200 - 250" lower="200.000000000000000" render="true" symbol="4" upper="250.000000000000000" uuid="{803e30cf-04f6-4dc4-89aa-c990a43b0647}"/>
+ <range label="250 - 300" lower="250.000000000000000" render="true" symbol="5" upper="300.000000000000000" uuid="{7e02135d-d6b5-4976-953b-a1fea7b9e88f}"/>
+ <range label="300 - 350" lower="300.000000000000000" render="true" symbol="6" upper="350.000000000000000" uuid="{5e239b7f-f691-4411-9244-110866d0b9cb}"/>
+ <range label="350 - 400" lower="350.000000000000000" render="true" symbol="7" upper="400.000000000000000" uuid="{0bc1b188-7e39-4bf5-9ccc-7cfb1c217140}"/>
+ <range label="400 - 450" lower="400.000000000000000" render="true" symbol="8" upper="450.000000000000000" uuid="{2264f038-1c90-4681-8e03-02ca065c8986}"/>
+ <range label="450 - 500" lower="450.000000000000000" render="true" symbol="9" upper="500.000000000000000" uuid="{dba00766-b289-4e1b-a938-d4dfde74a685}"/>
</ranges>
<symbols>
<symbol alpha="1" clip_to_extent="1" force_rhr="0" frame_rate="10" is_animated="0" name="0" type="marker">
@@ -600,9 +600,9 @@
<Option name="stops" type="QString" value="0.0196078;2,2,11,255,rgb:0.0078431,0.0078431,0.0431373,1;rgb;ccw:0.0392157;5,4,22,255,rgb:0.0196078,0.0156863,0.0862745,1;rgb;ccw:0.0588235;9,7,32,255,rgb:0.0352941,0.027451,0.1254902,1;rgb;ccw:0.0784314;14,11,43,255,rgb:0.054902,0.0431373,0.1686275,1;rgb;ccw:0.0980392;20,14,54,255,rgb:0.0784314,0.054902,0.2117647,1;rgb;ccw:0.117647;26,16,66,255,rgb:0.1019608,0.0627451,0.2588235,1;rgb;ccw:0.137255;33,17,78,255,rgb:0.1294118,0.0666667,0.3058824,1;rgb;ccw:0.156863;41,17,90,255,rgb:0.1607843,0.0666667,0.3529412,1;rgb;ccw:0.176471;49,17,101,255,rgb:0.1921569,0.0666667,0.3960784,1;rgb;ccw:0.196078;57,15,110,255,rgb:0.2235294,0.0588235,0.4313726,1;rgb;ccw:0.215686;66,15,117,255,rgb:0.2588235,0.0588235,0.4588235,1;rgb;ccw:0.235294;74,16,121,255,rgb:0.2901961,0.0627451,0.4745098,1;rgb;ccw:0.254902;82,19,124,255,rgb:0.3215686,0.0745098,0.4862745,1;rgb;ccw:0.27451;90,22,126,255,rgb:0.3529412,0.0862745,0.4941176,1;rgb;ccw:0.294118;98,25,128,255,rgb:0.3843137,0.0980392,0.5019608,1;rgb;ccw:0.313725;106,28,129,255,rgb:0.4156863,0.1098039,0.5058824,1;rgb;ccw:0.333333;114,31,129,255,rgb:0.4470588,0.1215686,0.5058824,1;rgb;ccw:0.352941;121,34,130,255,rgb:0.4745098,0.1333333,0.509804,1;rgb;ccw:0.372549;129,37,129,255,rgb:0.5058824,0.145098,0.5058824,1;rgb;ccw:0.392157;137,40,129,255,rgb:0.5372549,0.1568628,0.5058824,1;rgb;ccw:0.411765;145,43,129,255,rgb:0.5686275,0.1686275,0.5058824,1;rgb;ccw:0.431373;153,45,128,255,rgb:0.6,0.1764706,0.5019608,1;rgb;ccw:0.45098;161,48,126,255,rgb:0.6313726,0.1882353,0.4941176,1;rgb;ccw:0.470588;170,51,125,255,rgb:0.6666667,0.2,0.4901961,1;rgb;ccw:0.490196;178,53,123,255,rgb:0.6980392,0.2078431,0.4823529,1;rgb;ccw:0.509804;186,56,120,255,rgb:0.7294118,0.2196078,0.4705882,1;rgb;ccw:0.529412;194,59,117,255,rgb:0.7607843,0.2313726,0.4588235,1;rgb;ccw:0.54902;202,62,114,255,rgb:0.7921569,0.2431373,0.4470588,1;rgb;ccw:0.568627;210,66,111,255,rgb:0.8235294,0.2588235,0.4352941,1;rgb;ccw:0.588235;217,70,107,255,rgb:0.8509804,0.2745098,0.4196078,1;rgb;ccw:0.607843;224,76,103,255,rgb:0.8784314,0.2980392,0.4039216,1;rgb;ccw:0.627451;231,82,99,255,rgb:0.9058824,0.3215686,0.3882353,1;rgb;ccw:0.647059;236,88,96,255,rgb:0.9254902,0.345098,0.3764706,1;rgb;ccw:0.666667;241,96,93,255,rgb:0.945098,0.3764706,0.3647059,1;rgb;ccw:0.686275;244,105,92,255,rgb:0.9568627,0.4117647,0.3607843,1;rgb;ccw:0.705882;247,114,92,255,rgb:0.9686275,0.4470588,0.3607843,1;rgb;ccw:0.72549;249,123,93,255,rgb:0.9764706,0.4823529,0.3647059,1;rgb;ccw:0.745098;251,133,96,255,rgb:0.9843137,0.5215687,0.3764706,1;rgb;ccw:0.764706;252,142,100,255,rgb:0.9882353,0.5568628,0.3921569,1;rgb;ccw:0.784314;253,152,105,255,rgb:0.9921569,0.5960785,0.4117647,1;rgb;ccw:0.803922;254,161,110,255,rgb:0.9960784,0.6313726,0.4313726,1;rgb;ccw:0.823529;254,170,116,255,rgb:0.9960784,0.6666667,0.454902,1;rgb;ccw:0.843137;254,180,123,255,rgb:0.9960784,0.7058824,0.4823529,1;rgb;ccw:0.862745;254,189,130,255,rgb:0.9960784,0.7411765,0.509804,1;rgb;ccw:0.882353;254,198,138,255,rgb:0.9960784,0.7764706,0.5411765,1;rgb;ccw:0.901961;254,207,146,255,rgb:0.9960784,0.8117647,0.572549,1;rgb;ccw:0.921569;254,216,154,255,rgb:0.9960784,0.8470588,0.6039216,1;rgb;ccw:0.941176;253,226,163,255,rgb:0.9921569,0.8862745,0.6392157,1;rgb;ccw:0.960784;253,235,172,255,rgb:0.9921569,0.9215686,0.6745098,1;rgb;ccw:0.980392;252,244,182,255,rgb:0.9882353,0.9568627,0.7137255,1;rgb;ccw"/>
</Option>
</colorramp>
- <classificationMethod id="Jenks">
+ <classificationMethod id="EqualInterval">
<symmetricMode astride="0" enabled="0" symmetrypoint="0"/>
- <labelFormat format="%1 - %2" labelprecision="1" trimtrailingzeroes="0"/>
+ <labelFormat format="%1 - %2" labelprecision="0" trimtrailingzeroes="0"/>
<parameters>
<Option/>
</parameters>
diff --git a/test/test_core.py b/test/test_core.py
@@ -2,11 +2,13 @@ from pathlib import Path
from tempfile import TemporaryDirectory
import shutil
import unittest
+import xml.etree.ElementTree as ET
from tem_loader.core import process_xyz, write_csv
FIXTURE_DIR = Path(__file__).parent / "data"
+STYLES_DIR = Path(__file__).resolve().parent.parent / "tem_loader" / "styles"
class ProcessXYZTests(unittest.TestCase):
@@ -52,3 +54,41 @@ class ProcessXYZTests(unittest.TestCase):
self.assertTrue(out_path.exists())
self.assertIn("StationNo", out_path.read_text().splitlines()[0])
+
+ def test_fixture_doi_values_fit_fixed_scale(self):
+ for path in sorted(FIXTURE_DIR.glob("*.xyz")):
+ _, doi_points, _ = process_xyz(path)
+ values = [row["DOI"] for row in doi_points]
+
+ self.assertGreaterEqual(min(values), 0.0, path.name)
+ self.assertLessEqual(max(values), 500.0, path.name)
+
+ def test_doi_style_uses_fixed_zero_to_five_hundred_ranges(self):
+ tree = ET.parse(STYLES_DIR / "doi.qml")
+ renderer = tree.getroot().find(".//renderer-v2")
+ self.assertIsNotNone(renderer)
+ self.assertEqual(renderer.attrib["attr"], "DOI")
+
+ ranges = renderer.findall("./ranges/range")
+ self.assertEqual(len(ranges), 10)
+ self.assertEqual(ranges[0].attrib["lower"], "0.000000000000000")
+ self.assertEqual(ranges[-1].attrib["upper"], "500.000000000000000")
+ self.assertEqual(
+ [(r.attrib["lower"], r.attrib["upper"]) for r in ranges],
+ [
+ ("0.000000000000000", "50.000000000000000"),
+ ("50.000000000000000", "100.000000000000000"),
+ ("100.000000000000000", "150.000000000000000"),
+ ("150.000000000000000", "200.000000000000000"),
+ ("200.000000000000000", "250.000000000000000"),
+ ("250.000000000000000", "300.000000000000000"),
+ ("300.000000000000000", "350.000000000000000"),
+ ("350.000000000000000", "400.000000000000000"),
+ ("400.000000000000000", "450.000000000000000"),
+ ("450.000000000000000", "500.000000000000000"),
+ ],
+ )
+
+ method = renderer.find("./classificationMethod")
+ self.assertIsNotNone(method)
+ self.assertEqual(method.attrib["id"], "EqualInterval")