The World's Largest QR Codes and What Breaks at That Scale — featured illustration
Technology

The World's Largest QR Codes and What Breaks at That Scale

8 min read
Create a QR code

Somebody stamps a QR code into a snowfield with a grid of trampled paths, photographs it from a drone, and it decodes. Somebody else mows one into a field of barley, or paints one across a warehouse roof, or hangs one down the side of a tower block. Record claims turn up every few years, measured in square metres or in hectares, and no single authority certifies them consistently, so the numbers depend on who is counting and what they agree to count.

What does not change is the physics. A QR code four hundred metres across obeys the same ratio as one on a business card, and everything interesting about building a huge one lives in the failure modes that only appear at scale.

The ratio is the same, which is the easy part

Sizing is a ratio rather than a measurement: a code's width wants to be roughly a tenth of the distance it is read from. Working out physical size is the same arithmetic whether the answer lands in centimetres or in hundreds of metres, and the field rules for placement and size are the same rules too.

Run it backwards for a big code. A symbol one hundred metres across is comfortable from about a kilometre. A symbol four hundred metres across is comfortable from four kilometres. That sounds generous until you notice what a kilometre of standoff implies about the reader.

The module count is the other half of it. A short payload keeps the version low and the modules wide, and at architectural scale a module is a plot of land. A 25-module symbol at one hundred metres gives modules four metres on a side. A 57-module symbol at the same overall width gives modules of 1.75 metres, and every one of those is now a patch somebody has to make uniformly dark or uniformly light using whatever material is available. Shortening the encoded string is worth more here than at any other scale, because each character removed gives back square metres of physical work.

Altitude is the reader problem

Nobody reads a hillside code from the hillside. Getting the whole symbol plus its margin into one frame takes altitude, distance, or a very wide lens, and each of those costs resolution on the modules.

A drone is the usual answer, and drones are why these projects get photographed rather than scanned. The workflow is almost always the same: fly up, take a still, land, decode the still. That is a legitimate read, and decoding from a picture is how large codes are actually consumed, including every one that has ever appeared in a news photograph.

The constraints that follow are aviation constraints rather than optical ones. Altitude limits over populated areas, line of sight, wind, battery endurance, and the angle you can hold while framing. A phone on the ground at the edge of a field reads nothing at all, which is worth saying out loud before anybody builds a code hoping passers-by will scan it. If the audience is standing on the ground, the code belongs on a wall at ground level, and codes on glass and building frontages is then the more useful reference.

The quiet zone becomes a groundskeeping job

At small sizes the margin is white paper. At large sizes it is land, and it has to behave like the light modules across its whole area.

Four modules of margin on a symbol with four-metre modules is sixteen metres of clear ground on every side. On a rooftop that is usually available. On a hillside it is a hedge, a track, a drainage ditch and somebody else's boundary. Whatever is there has to read as light to a camera hundreds of metres up, at the same tone as the light modules inside the code, which is a much stricter requirement than merely being empty. A gravel path running through the margin is a dark line in the worst possible place, and what a decoder does with that empty space explains why a dark line there costs you the finder patterns rather than a handful of data bits.

Our own generator defaults to a two-module margin, with a slider up to eight in the Colors tab under Design, while the standard asks for four. At this scale, export at four or more and treat those modules as part of the site plan, because adding them afterwards means renting more land.

Snow, grass and crops change tone with the weather

This is the failure mode unique to landscape codes, and it is the one that ends most of them.

A code works because the dark element and the light element differ in reflectance by enough that a camera can threshold between them. Fresh snow is among the brightest natural surfaces there is, and trampled snow is only slightly darker, so a snow code drawn by walking is a low-contrast code from the moment it is finished. It then gets worse through the day: the sun angle changes the shadowing inside the compressed tracks, a thaw fills the paths with water and darkens them unpredictably, and one hour of fresh snowfall erases the whole thing.

Grass and crops have the same problem on a slower clock. Mown grass against standing grass is a difference in height and shadow more than a difference in colour, so the contrast depends entirely on the sun. It is strong in the early morning and at dusk, when low light throws long shadows out of the standing crop, and weak at midday when the sun is overhead and nothing casts a shadow at all. Cloud cover flattens it completely. A field code that decodes at nine in the morning can be invisible by one in the afternoon.

Paint on a hard surface is the reliable choice for exactly this reason, and its compromises are the ones in stencilling and spraying a code scaled up: overspray closing the light gaps between modules, keeping module edges crisp over long runs, and the fact that a painted code cannot be edited afterwards.

Materials in rough order of reliability: paint or applied sheet on a hard surface; dark fabric, tarpaulin or matting laid over snow or grass; bark, gravel or soil spread inside a frame; and cut or mown vegetation only where you control the hour the photograph is taken.

Flatness, perspective, and the plane you do not have

A decoder copes with a symbol seen at an angle, because the finder patterns and the alignment patterns between them let it work out the perspective transform and resample the grid. What it cannot cope with is a surface that is not a plane.

A hillside is not a plane. It is a curve, often a compound one, so a code laid out on a flat plan and transferred to the ground comes out with its module pitch varying across the symbol. The alignment patterns in larger versions exist to correct moderate distortion, but they were calibrated for a printed label that has been bent, not for two hundred metres of terrain.

There are two ways round it. Survey the slope and pre-distort the layout so the symbol is square as seen from the intended camera position, which makes that camera position part of the design and means the code reads only from there. Or pick a flat site: a rooftop, a car park, a sports field, a dry lake bed, a flat stretch of beach. The second is what almost every successful large code has done.

Roof codes have a quirk worth knowing: they are aimed at aircraft and at satellite imagery, and satellite imagery refreshes on a schedule nobody controls. A code painted in the hope that a mapping service will pick it up may sit unread for a year.

What to do with the ambition

If the goal is a photograph and a story, a large code is a good project and every constraint above is manageable on a flat site with paint and a drone. If the goal is scans from members of the public, the honest answer is that a huge code produces almost none, because the reader has to be in the air.

Either way the destination outlives the build. A painted or planted code cannot be changed once it exists, so point it at a short path on a domain you control and put a redirect behind it. Every code built here is dynamic and resolves through a redirect, with the destination editable on the paid plan, which is the only part of a four-hundred-metre code that is cheap to revise.

Share this article