Skip to content

Commit 951d0f1

Browse files
committed
Require climb for stairs normalization
1 parent cea49b1 commit 951d0f1

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

src/osm_osw_reformatter/serializer/osw/osw_normalizer.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ class OSWWayNormalizer:
1818
"trunk_link"
1919
)
2020

21+
CLIMB_VALUES = (
22+
"up",
23+
"down",
24+
)
25+
2126
def __init__(self, tags):
2227
self.tags = tags
2328

@@ -67,7 +72,16 @@ def normalize(self):
6772
raise ValueError("This is an invalid way")
6873

6974
def _normalize_way(self, keep_keys={}, defaults = {}):
70-
generic_keep_keys = {"highway": str, "width": float, "surface": surface, "name": str, "description": str, "foot": foot, "incline": incline}
75+
generic_keep_keys = {
76+
"highway": str,
77+
"width": float,
78+
"surface": surface,
79+
"name": str,
80+
"description": str,
81+
"foot": foot,
82+
"incline": incline,
83+
"length": float,
84+
}
7185
generic_defaults = {}
7286

7387
new_tags = _normalize(self.tags, {**generic_keep_keys, **keep_keys}, {**generic_defaults, **defaults})
@@ -81,7 +95,7 @@ def _normalize_pedestrian(self, keep_keys = {}, defaults = {}):
8195
return new_tags
8296

8397
def _normalize_stairs(self, keep_keys = {}, defaults = {}):
84-
generic_keep_keys = {"step_count": int, "incline": incline}
98+
generic_keep_keys = {"step_count": int, "climb": str}
8599
generic_defaults = {"foot": "yes"}
86100

87101
new_tags = self._normalize_way({**generic_keep_keys, **keep_keys}, {**generic_defaults, **defaults})
@@ -155,7 +169,10 @@ def is_footway(self):
155169
return (self.tags.get("highway", "") == "footway")
156170

157171
def is_stairs(self):
158-
return self.tags.get("highway", "") == "steps"
172+
return (
173+
self.tags.get("highway", "") == "steps"
174+
and self.tags.get("climb", "") in self.CLIMB_VALUES
175+
)
159176

160177
def is_pedestrian(self):
161178
return self.tags.get("highway", "") == "pedestrian"
@@ -584,10 +601,7 @@ def crossing_markings(tag_value, tags):
584601
return None
585602

586603
def climb(tag_value, tags):
587-
if tag_value.lower() not in (
588-
"up",
589-
"down"
590-
):
604+
if tag_value.lower() not in OSWWayNormalizer.CLIMB_VALUES:
591605
return None
592606
else:
593607
return tag_value.lower()

tests/unit_tests/test_serializer/test_osw_normalizer.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,20 @@ def test_is_footway(self):
3434
self.assertTrue(normalizer.is_footway())
3535

3636
def test_is_stairs(self):
37-
tags = {'highway': 'steps'}
37+
tags = {'highway': 'steps', 'climb': 'up'}
3838
normalizer = OSWWayNormalizer(tags)
3939
self.assertTrue(normalizer.is_stairs())
4040

41+
def test_is_stairs_invalid_climb(self):
42+
tags = {'highway': 'steps', 'climb': 'left'}
43+
normalizer = OSWWayNormalizer(tags)
44+
self.assertFalse(normalizer.is_stairs())
45+
46+
def test_is_stairs_missing_climb(self):
47+
tags = {'highway': 'steps'}
48+
normalizer = OSWWayNormalizer(tags)
49+
self.assertFalse(normalizer.is_stairs())
50+
4151
def test_is_pedestrian(self):
4252
tags = {'highway': 'pedestrian'}
4353
normalizer = OSWWayNormalizer(tags)
@@ -69,6 +79,20 @@ def test_normalize_incline(self):
6979
expected = {'highway': 'footway', 'incline': 10.0, 'foot': 'yes'}
7080
self.assertEqual(result, expected)
7181

82+
def test_normalize_length(self):
83+
tags = {'highway': 'footway', 'length': '12'}
84+
normalizer = OSWWayNormalizer(tags)
85+
result = normalizer.normalize()
86+
expected = {'highway': 'footway', 'length': 12.0, 'foot': 'yes'}
87+
self.assertEqual(result, expected)
88+
89+
def test_normalize_stairs_keeps_climb(self):
90+
tags = {'highway': 'steps', 'climb': 'down', 'step_count': '3'}
91+
normalizer = OSWWayNormalizer(tags)
92+
result = normalizer.normalize()
93+
expected = {'highway': 'steps', 'climb': 'down', 'step_count': 3, 'foot': 'yes'}
94+
self.assertEqual(result, expected)
95+
7296
def test_normalize_invalid_way(self):
7397
tags = {'highway': 'invalid_type'}
7498
normalizer = OSWWayNormalizer(tags)

0 commit comments

Comments
 (0)