Choosing Minimum Feature Size Thresholds by Output Medium
Fix the smallest mark the output medium can reliably show, convert it to ground units at each scale, and derive every drop threshold and simplification tolerance from that one figure — so that porting a style from screen to press changes one parameter instead of forty.
Core Algorithm and Workflow
Every map has a smallest mark it can draw. Below that size a line becomes intermittent, a polygon becomes a smudge, and a symbol becomes indistinguishable from a dot. The size differs by medium, and almost every scale-related threshold in a style is downstream of it.
The derivation is three lines of arithmetic and one decision:
- Choose the minimum mark for the medium. A solid line on a coated offset press holds at about 0.1 mm; a tinted line needs 0.15. A screen mark needs about one device pixel. A large-format sheet read from two metres is limited by the eye rather than the device, at roughly 0.5 mm.
- Convert to ground units per scale. Ground distance = mark size × scale denominator.
- Apply it twice. As a drop threshold — features narrower than this are omitted — and as a simplification tolerance, since a vertex whose removal moves the line less than one mark cannot be seen.
Production-Ready Python Implementation
MIN_MARK_MM = {
"screen_1x": 0.26, # one CSS pixel at 96 dpi
"screen_2x": 0.16, # one device pixel at 2× density
"offset_coated": 0.10, # solid line; use 0.15 for a tinted line
"offset_uncoated": 0.15, # dot gain eats fine detail on uncoated stock
"large_format_2m": 0.50, # eye-limited rather than device-limited
}
def ground_threshold(medium: str, scale_denominator: float) -> float:
"""Smallest ground distance this medium can show at this scale, in metres."""
if medium not in MIN_MARK_MM:
raise KeyError(f"unknown medium {medium!r}; add it to MIN_MARK_MM")
if scale_denominator <= 0:
raise ValueError("scale denominator must be positive")
return (MIN_MARK_MM[medium] / 1000.0) * scale_denominator
def style_thresholds(medium: str, scale_denominator: float) -> dict:
"""Drop threshold and simplification tolerance from one figure."""
t = ground_threshold(medium, scale_denominator)
return {
"min_mark_mm": MIN_MARK_MM[medium],
"drop_below_m": round(t, 2), # narrower than this: omit
"simplify_tolerance_m": round(t, 2), # vertex moves less than this: remove
"min_symbol_m": round(t * 3, 2), # a symbol needs a few marks to read
}
min_symbol_m is three marks rather than one because a symbol has to be identifiable, not merely visible. A single-mark dot is present on the page and conveys nothing about what kind of feature it is — the same distinction made about icon sizes in Sizing Point Symbols Across Zoom Levels Deterministically.
Performance Tuning and Cartographic Best Practices
- Test the narrowest dimension, not the area. A polygon a tenth of a millimetre wide and fifty long has ample area and still prints as an intermittent hairline. The diameter of the largest inscribed circle is a serviceable proxy for a polygon’s rendered width.
- Keep the threshold in the style, not in the data. Dropping features is a rendering decision per scale and per medium. Baking it into a derived dataset means one extract cannot serve both a screen and a print product, and it makes the omission invisible to later readers of the data.
- Confirm the figure with the actual press. The values above are starting points. Uncoated stock and high dot gain push the practical minimum well above the theoretical one, and the printer knows their own number.
- Apply the same figure to generalisation. A simplification tolerance derived from a different constant than the drop threshold produces a style where visible features have invisible detail, or the reverse.
- Re-derive on every medium change. Making the medium a parameter is the whole point; a style with the ground distances written in as constants has silently baked in a medium nobody recorded.
Integration and Next Steps
This figure is the input to the zoom-threshold table described in Automated Cartographic Design Fundamentals and to the tolerance selection in Generalization and Simplification. Because it is a property of the medium, it is also what has to change when the same style serves both a web map and a printed atlas — and making it a single named parameter is what turns that from a style rewrite into a configuration value.
Frequently Asked Questions
What is the smallest mark that reliably survives?
On a coated offset press, roughly 0.1 millimetres for a solid line and 0.15 for one carrying a tint; uncoated stock needs more because dot gain spreads fine detail. On screen the floor is about one device pixel, which at 2× density is 0.16 millimetres of physical display. For large-format print read from two metres the eye binds before the device does, at roughly 0.5 millimetres. Treat all of these as starting points and confirm with the specific press or display — printers know their own number and will give it.
Should the threshold apply to area or to width?
To the narrowest rendered dimension. A polygon a tenth of a millimetre wide and fifty long has plenty of area and prints as an intermittent hairline, and that shape — river channels, coastal spits, narrow woodland strips — is extremely common in natural-feature data. For a polygon, the diameter of the largest inscribed circle is a practical proxy for rendered width and is cheap to compute.
Does the threshold change the data or only the drawing?
Only the drawing, and keeping it that way matters. Dropping features below a threshold is a decision about a specific scale and medium, so it belongs in the style. Baking it into a derived dataset means the same extract cannot serve both a screen product and a print product, and it hides the omission from anyone who later reads the data without knowing what was removed or why.
How does this relate to generalisation tolerance?
They are one figure applied twice. A vertex whose removal displaces the line by less than one minimum mark cannot be distinguished from the original, so the simplification tolerance is the same ground distance as the drop threshold. Deriving both from a single parameter is what keeps them consistent when the medium changes — authoring them separately produces a style where visible features carry invisible detail, or where simplified features are dropped anyway.
Related
- Generalization and Simplification — the tolerance this figure sets.
- Converting Web Mercator Zoom Levels to Print Scale Denominators — the scale side of the same conversion.
Back to Scale Mapping for Web and Print