def neighbors(ctx, input): """Takes [x, y, z] tiles as input and writes adjacent tiles on the same zoom level to stdout in the same form. There are no ordering guarantees for the output tiles. Input may be a compact newline-delimited sequences of JSON or a pretty-printed ASCII RS-delimited sequence of JSON (like https://tools.ietf.org/html/rfc8142 and https://tools.ietf.org/html/rfc7159). Example: \b echo "[486, 332, 10]" | mercantile neighbors [485, 331, 10] [485, 332, 10] [485, 333, 10] [486, 331, 10] [486, 333, 10] [487, 331, 10] [487, 332, 10] [487, 333, 10] """ src = normalize_input(input) for line in iter_lines(src): tile = json.loads(line)[:3] tiles = mercantile.neighbors(tile) for t in tiles: output = json.dumps(t) click.echo(output)
def test_neighbors_invalid(): x, y, z = 0, 166, 9 tiles = mercantile.neighbors(x, y, z) assert len(tiles) == 8 - 3 # no top-left, left, bottom-left assert all(t.z == z for t in tiles) assert all(t.x - x in (-1, 0, 1) for t in tiles) assert all(t.y - y in (-1, 0, 1) for t in tiles)
def test_neighbors(): x, y, z = 243, 166, 9 tiles = mercantile.neighbors(x, y, z) assert len(tiles) == 8 assert all(t.z == z for t in tiles) assert all(t.x - x in (-1, 0, 1) for t in tiles) assert all(t.y - y in (-1, 0, 1) for t in tiles)
def test_root_neighbors_invalid(): x, y, z = 0, 0, 0 tiles = mercantile.neighbors(x, y, z) assert len(tiles) == 0 # root tile has no neighbors