public static void renderAllTiles(int z, int x, int y, int z_start, int z_stop) throws IOException {
		// find the projected bounds of this tile in osm projection
		double[] tile = TileToMercBounds.tileToMercBounds(z, x, y);
		
		// convert the bounds to a jts geometry
		Envelope envolope = new Envelope(tile[0], tile[2], tile[1], tile[3]);
		Geometry bbox = gf.toGeometry(envolope);
		
		// see if our tile intersects with any of the polygons for the regions to render
		boolean intersects = false;
		
		if (imageryBoundaries == null) {
			intersects = true;
		}else{
			for (Geometry i : imageryBoundaries) {
				intersects = intersects || i.intersects(bbox);
				if (intersects)
					break; // no need to check the rest of the candidates if we already have a match
			}
		}
		
		if (intersects) {
			if (z >= z_start) {
				tileListWriter.write(z + "/" + x + "/" + y + "\n");
				tileCount++;
			}
			
			// move on to a higher zoom level
			if (z < z_stop) {
				renderAllTiles(z + 1, x*2, y*2, z_start, z_stop);
				renderAllTiles(z + 1, x*2 + 1, y*2, z_start, z_stop);
				renderAllTiles(z + 1, x*2, y*2 + 1, z_start, z_stop);
				renderAllTiles(z + 1, x*2 + 1, y*2 + 1, z_start, z_stop);
			}
		}
		
		return;
	}